1.explicit
明确的,清楚的
作用是表明构造函数是显示的,而非隐式的,不能进行隐藏式转换。跟他对应的另一个关键字式implicit,意思式隐藏的,类的构造函数默认情况下即声明为implicit。
用这个来避免声明对象的时候产生的歧义。
explicit Student(int _age) //必须显示构造
{
age = _age;
cout << "age = " << age << endl;
}
Student(int _age, string _name) //可以隐式构造,也可以显示构造
{
age = _age;
name = _name;
cout << "age = " << age <<" ";
cout << "name = " << name << endl;
}
Student A(19, "xiaoming"); //显示构造
Student B (18); //显示构造
Student C = 18; //隐式构造
Student C = {18, "xiaohong"}; //隐式构造
2.左值,右值的概念
按字面意思就是,以赋值符号 = 为界, = 的左边为左值,右边为右值
左值:代表一个在内存中占有确定位置的对象,就是有一个确切的地址
右值:不是左值的都是右值,一般来说就是不在内存中占有确切位置的表达式,而是在寄存器中(临时的数据)进行运算。
int a = 1;
int b = 2;
int c = 3;
c = a + b;
通过gcc转换为汇编代码
可以看出在对a+b进行运算之前,是将a,b的值放到了寄存器中,然后进行加法运算,最后保存到c所在的内存中。需要被赋值的对象需要在内存中有确切的位置,即是左值。
所有左值(无论是数组,函数或者不完全类型)都可以转换为右值。就是将内存中的数据移到寄存器中。
3.函数的返回值当引用
1.当函数返回局部变量引用值为引用的时候:
若返回栈变量,不能成为其它引用的初始值,
函数返回局部变量不能作为左值
2.若返回静态变量或者全局变量:可以成为其他引用的初始值,即可作为右值,使用也可以作为左值使用
3.返回形参当引用
普通形参也是局部变量
引用变量为形参是可以的
总结就是看变量的生存周期,要避免短周期的变量的引用,它很有可能释放,会出现问题