寻找常州微信网站建设,企业网站管理系统最新4湖南岚鸿牛x1 0,使用wordpress,网站建设数据中心3 面试题3#xff1a;形参与实参的区别
形参#xff1a;函数定义时的参数#xff0c;可以看作是一个占位符。形参只有在被调用的时候才分配内存单元#xff0c;只在函数内部有效#xff0c;调用结束后立即释放。 实参#xff1a;调用函数时使用的参数#xff0c;实参可…3 面试题3形参与实参的区别
形参函数定义时的参数可以看作是一个占位符。形参只有在被调用的时候才分配内存单元只在函数内部有效调用结束后立即释放。 实参调用函数时使用的参数实参可以是常量、变量、表达式、函数等。如果实参和形参的类型不匹配编译器会尝试进行类型转换。如果无法进行类型转换编译器将会报错。 具体区别如下 1内存分配形参只有在调用的时候才会分配内存调用结束后就会释放内存。而实参的情况就比较复杂比如一个字符串常量的实参其内存分配在文字常量区。 2类型匹配实参和形参在数量上类型上顺序上应严格一致 如果实参和形参的类型不匹配编译器会尝试进行类型转换。如果无法进行类型转换编译器将会报类型不匹配的错误。 3数据传送函数调用中发生的数据传送是单向的。即只能把实参的值传送给形参而不能把形参的值反向地传送给实参。 4传递方式将实参的值传送给形参的方式分为值传递、指针传递、引用传递。值传递时形参的值发生改变实参中的值不会变化。指针传递与引用传递时对形参的改变会影响到实参。 重点注意 指针传递时如果对其做创建新对象的操作 new 则实参中的值不会变化即不会替换为这个新创建的对象如下为样例代码
#include iostream
using namespace std;class Student
{
public:Student(const string name){m_name name;}~Student() {}public:string getName(){return m_name;}private:string m_name;
};void changeName(Student* st, string name)
{st new Student(name);
}int main()
{Student* st new Student(zhangsan);changeName(st, lisi);printf(name %s\n, st-getName().c_str());delete st;st nullptr;return 0;
}上面代码的输出为
name zhangsan这是由于形参 Student* st 与实参 Student* st 实际上还是两个变量只不过这两个变量指向同一个地址所以对形参做操作其操作的对象还是他们共同指向的地址即为函数外面的 st 对象。但是当对形参做 new 操作以后形参便指向了新的地址该函数执行结束后打印的字符串依然是原来 st 对象的成员变量。
4 面试题4值传递、指针传递、引用传递的区别
4.1 按值传递
按值传递是将实际参数的值复制到形式参数。使用这种方式调用函数本身不对实参进行操作。例如
#include iostream//函数的定义
void swap(int a, int b)
{int ca;ab;bc;
}int main()
{int a1,b2;swap(a,b); //ab 交换值失败printf(a%d, b%d\n,a,b);return 0;
}上面代码的输出为
a1, b24.2 按引用传递
按引用传递是将实际参数的地址传递给形式参数此时的形参相当于实参的别名。使用这种方式对形参的改变会影响到实参。例如
#include iostream//函数的定义
void swap(int a, int b)
{int ca;ab;bc;
}int main()
{int a1,b2;swap(a,b); //ab 交换值成功printf(a%d, b%d\n,a,b);return 0;
}上面代码的输出为
a2, b14.3 按指针传递
按指针传递是指将实参的地址传递给形参函数内部可以通过指针来操作实参的值。但需要注意指针为空的情况。样例代码如下
#include iostream//函数的定义
void swap(int* a, int* b)
{int c*a;*a*b;*bc;
}int main()
{int a1,b2;swap(a,b); //ab 交换值成功printf(a%d, b%d\n,a,b);return 0;
}上面代码的输出为
a2, b1需要注意的是从效率上来说按引用传递与按指针传递基本一样按值传递有拷贝过程性能很差不过从安全角度出发引用传递在参数传递过程中执行强类型检查而指针传递的类型检查较弱特别的如果参数被声明为 void 那么就不会做类型检查。所以推荐只用引用传递最好不用指针传递。