C++ Tips

{} 与 ()初始化变量

下面两种方式都把foobar初始化了10和100

    //圆括号初始化
    int foo(10);
    int bar(100);

    //花括号初始化
    int foo{10};
    int bar{100};
    

他们的区别在于花括号是C++11新引入的初始化方式,成为列表初始化 (list initialization),他们有一个区别:

    long double ID = 3.1415926;
    int foo{ID};//会报错,long double -> int会导致信息丢失
    int bar(ID);//虽然也会导致信息丢失,但圆括号允许这样的转换

所以用花括号来说比较有限制性,很安全。

struct 和 class的区别

一般定义类可以用classstruct两种关键字来定义,二者仅仅是形式上的区别,唯一的不同之处在于成员的默认访问权限不一样:

//class关键字定义类
class TEST_1 {
    int foo;//foo的访问权限是public
public:
    int a,b;
};

//struct关键字定义类
struct TEST_2 {
    int foo;//foo的访问权限是private
public:
    int a,b;
};

就像上面注释所说,如果使用class关键字定义类,那么在这个类中定义在第一个访问说明符之前的成员是private,相反,struct定义的类中定义在第一个访问说明符之前的成员默认是private的。(访问说明符:publicprivate)。

类的const成员函数

const Sales_Data& displayName() const;

类似于上面这种类的成员函数后跟const关键字的成员函数就是const成员函数。我们知道在调用成员函数时,会把当前对象的地址作为隐形的参数this传递进去。this是常量指针,也就是* const的,它的值不允许改变,但它指向的值可以不是常量。这就引发了一个问题:当类的一个实例被声明成了const,这个实例是无法调用一般的成员函数的,因为this* const而不是const * const。如果确实有必要,这时候就应该在一般函数的声明及定义结尾加上const,这样在const实例在调用该函数时this会被转换成const * const,第一个const就是结尾加的那个const。这时候这个成员函数就可以作用这个常量实例了。我们举个栗子:

class Foo {
public:
    int bar = 100;
    Foo() = default;
    Foo(int bar_) : bar(bar_){};
    void display_bar(){
        std::cout << bar;
    }
};

int main() {
    Foo a;
    a.display_bar();

    return 0;
}

在这个栗子中,display_bar成员函数打印出Foo类的bar值,没有对原对象作出任何改变。a的调用是没有任何问题的,但是bconst的,调用就立马出现了问题:

'this' argument to member function 'display_bar' has type 'const Foo', but function is not marked const
一旦编译运行就会报错:
passing 'const Foo' as 'this' argument discards qualifiers
所以为了使这个函数既适用于const对象以及非const对象,我们在加上const就不会出错了。

class Foo {
public:
    int bar = 100;
    Foo() = default;
    Foo(int bar_) : bar(bar_){};
    void display_bar() const{
        std::cout << bar;
    }
};

int main() {
    Foo a;
    a.display_bar();

    return 0;
}

incomplete类

类在没有定义之前,是一个不完全类型(incomplete type),所以一个类的成员不应该包含其自身类型。但是,类的成员可以包含其自身的指针或指针。

class Foo {
	int a = 100;
    //错,不允许类成员出现其本身类型
    //Foo b;
    Foo *b;//可以
}
posted @ 2018-12-01 15:56  bobliao  阅读(200)  评论(0编辑  收藏  举报