c++11及其它特性


image

一 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;
}
posted @ 2022-05-21 07:24  荒年、  阅读(30)  评论(0编辑  收藏  举报