c++11及其它特性
一 explicit 关键字
explicit /ɪkˈsplɪsɪt/ 明确的;清楚的;直率的;详述的
作用是表明该构造函数是显示的, 而非隐式的.不能进行隐式转换!避免歧义
跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式).
#include <iostream>
using namespace std;
class Student
{
public:
explicit Student(int age)
{
this->age = age;
}
explicit Student(int age, string name)
{
this->age = age;
this->name = name;
}
private:
int age;
string name;
};
int main()
{
Student s1(13); // 显示构造
//Student s2 = 14; // 隐式构造
Student s3(15, "小王"); // 显示构造
//Student s4 = { 16,"小李" }; // 隐式构造,初始化参数列表,c++11新特性
return 0;
}
二 左值和右值的概念
左值和右值的概念
按字面意思,通俗地说。以赋值符号 = 为界,= 左边的就是左值(lvalue),= 右边就是右值(rvalue)。
int a = 666;
左值 右值
int b = 888;
左值 右值
int c = a + b;
左值 右值 右值
lvalue - 代表一个在内存中占有确定位置的对象(换句话说就是有一个地址)。
rvalue - 通过排他性来定义,每个表达式不是lvalue就是rvalue。因此从上面的lvalue的定义,rvalue是在不在内存中占有确定位置的表达式,而是存在在寄存器中。
所有的左值(无论是数组,函数或不完全类型)都可以转换成右值。
三 函数返回值使用引用
C++引用使用时的难点:
当函数返回值为引用时:要注意返回的变量的生存周期
1.若返回栈变量,不能成为其它引用的初始值,不能作为左值使用, 当函数结束的时候栈空间会被释放,所以不能返回栈变量
2.若返回静态变量或全局变量,可以成为其他引用的初始值,即可作为右值使用,也可作为左值使用
3.返回形参当引用(注:C++链式编程中,经常用到引用,运算符重载专题。例如重载<<运算符的时候,返回的就是ostream的引用)
// 函数返回形参(普通参数)当引用
int &demo1(int var) // 这个形参也是放在栈上的,函数结束的时候栈空间释放,所以不能这样用
{
var = 666;
return var;
}
// 函数返回形参(引用)当引用
int &demo2(int &var) // 引用的本质是常量指针,所以这里要看var所指向的内存的生存周期
{
var = 666;
return var;
}