用C/C++的同学一定会觉得本来就是如此,但作为一个一直以Java为生的人,却会认为这是不可思议的. 当然,依然有N多用Java的同学,可能连这个基础都没搞明白,他们估计以为以下Java代码会改变o的指向,从而让调用方的o对象值发生改变.
void test(Object o) {
o = new MyInt();
o.setInt(12);
}
static void main(String[] args) {
MyInt o = new MyInt();
o.setInt(1);
test(o); //会以为test改变了o对象, 其实不然.
}
Objective-C它也是面向对象, 以上类似的代码也一样是无法改变传入的形参对象的指向, 因为它们形参都是原参对象的指针副本, 更改这个指针副本的指向根本不会影响到原有对象的指向.
那么Objective-C因为是C的超集,它继承了C的指针,以及指针的指针等一系列操作访问内存的能力, 所以它可以实现在一个函数将形参对象改变指向并影响了调用方真实对象的指向.
void change(MyObject **);
void change(MyObject **prt) {
[(*prt) release];
(*prt) = [[MyObject alloc] init];
(*prt).type = @"Change";
}
int main(void) {
@autoreleasepool {
MyObject *object = [[MyObject alloc] init];
object.type = @"hello it";
change(&object); //通过传入地址,来实现类似于基本类型(int,long)的地址指向的内容的改写.从而达到改变prt的指向
[object release];
}
}
分享到:
相关推荐
如果形参是指针类型的,那么函数体内是否可以修改指针所指向的对象的值呢?答案是需要分情况讨论。如果函数的形参是非 const 类型的指针,则函数可以通过指针实现赋值,修改指针所指向对象的值。所以,如果需要保护...
3. this指针在C++中用于在成员函数内部指向调用该成员函数的对象,因此它确保每个对象有自己的数据成员,但共享处理这些数据的代码。选项A正确。 4. 多态性(Polymorphism)是指不同对象对同一消息做出不同响应的...
形参是函数定义中的参数,只在函数体内有效,调用结束后释放。实参是调用函数时提供的具体值,可以是变量、表达式等。实参和形参的数量、类型和顺序必须匹配,数据传递是单向的,即形参改变不会影响实参。值传递时,...
这个对象可以在函数体内直接使用,无须提前声明参数名即可访问参数。每一个JavaScript函数作用域内都有一个名为arguments的局部变量,它包含了传递给函数的所有参数列表。 虽然arguments对象在语法上与数组相似,如...
但是如果局部变量被赋值后,再次引用时没有使用var、let或const关键字声明,则该引用会指向形参,从而改变形参的值。 最后,如果只是声明了局部变量而没有赋值,那么局部变量和形参将指向同一个值。在f3函数的例子...
- **方法体和局部变量**: 方法体内的代码实现,局部变量仅在该方法内部有效。 - **静态方法和实例方法**: 静态方法不依赖于类的实例,可以直接通过类名调用;实例方法则需要创建类的实例后才能调用。 - **虚方法...
虚表指针(vptr)在派生类对象构造时进行初始化,指向对应的虚函数表。 #### 7. new/delete与malloc/free异同 new/delete是C++的关键字,可以进行构造函数和析构函数的调用,同时支持类型安全检查。malloc/free是C...
类的内联函数可以直接在类体内定义,也可以在类体外通过inline关键字定义。 (3)程序的输出结果取决于变量num和引用ref的值。程序首先定义了一个整型变量num并赋值为1,然后创建了一个对num的引用ref。ref=ref+2将...
- **局部变量**: 在方法体内声明的变量。 **1.6.6.3 静态方法和实例方法** - **静态方法**: 不依赖于类的实例,可以通过类名直接调用。 - **实例方法**: 需要创建类的实例后才能调用的方法。 **1.6.6.4 虚方法、...
- A选项正确,形式参数在方法调用时接收实际参数的值或引用,它们的作用域仅限于方法内部,类似于局部变量。 - B选项错误,形式参数不能被像静态(static)这样的字段修饰符修饰。 - C选项错误,形式参数是方法定义...
这种情况下,`n`作为形参,在函数体内不可被修改。 2. **修饰指针参数**: - **语法**: ```cpp void function(const TYPE *Var); void function(TYPE *const Var); ``` - **示例**: ```cpp void function...
- **引用**:实质上传递的是地址,但在函数体内操作时直接作用于原始变量。 #### 二、从汇编语言层面理解引用 在C++中,引用在底层实际上是通过指针实现的。下面通过一段示例代码来具体说明这一点: ```cpp int ...
9. **内联函数**:成员函数在类体内定义默认为内联函数。 10. **数组定义**:定义数组时必须指定元素个数。 11. **对象与类的关系**:对象是类的具体实例,类是对象的抽象。 12. **默认形参**:函数的默认形参...
1. **值传递**:函数调用时,实参的值被复制到形参中,形参在函数体内的改变不会影响到实参。这种传递方式适用于较小的数据类型,如基本类型(int, char等)。 例如,在C语言中,当调用`add(1, 2)`时,1和2的值被...
- **传值**: 函数接收的是实参的副本,在函数内部对形参所做的任何改变都不会影响到实参。 - **传引用**: 函数接收的是实参的引用,在函数内部对形参的操作会影响到实参本身。 - **传常量引用**: 类似传引用,但...
- 在循环体内,首先将计数器 `countX` 加一。 - 然后通过 `x = x & (x - 1)` 来消除 `x` 的二进制表示中最右边的一个 1。 - 当 `x` 变为 0 时,循环结束。 **扩展知识点:** 二进制位操作是计算机科学中非常基础也是...
- 对于形参,`final`关键字可以防止在方法体内修改参数的值。 4. **final修饰变量的“宏替换”/“宏变量”问题** 当`final`修饰的变量在编译期间其值就可以确定时,编译器可能会进行优化,将其直接替换为对应的值...
- 函数名本质上是一个指向函数对象的变量,可以使用`typeof`检查其类型。 - 形参定义时不指定类型,它们默认为可修改的局部变量。 - 函数调用时,参数数量可以不匹配,不足的参数默认为`undefined`,多余的参数会...
- **指针作为形参类型**:传递地址,允许修改被指向的对象。 - **指针与数组**:数组名可以被视为指向首元素的指针。 - **指针与结构**:可以通过指针访问结构中的成员。 - **动态变量**:使用`new`和`delete`操作符...