构造、拷贝、赋值、析构(初级)

构造

基本内容

不能声明为const

原因是常量对象完成构造函数的初始化后才获得常量属性,在此期间构造函数可以操作常量对象,声明也没用。

合成的默认构造函数

假如我们没有显式定义任何构造函数,编译器将为我们合成一个默认构造函数来初始化我们的成员变量。初始化原则:

1.有类内初始值的,按这些值初始化。

2.没有的,按变量默认初始化方式(未定义的行为)。

class A
{
    int a = 0;
    double b = 0;   //这两句有类内初始值
    char c;

}

注意的地方

1. 一旦我们定义了构造函数,系统不帮我们生成默认构造函数(不带任何形参),我们要自己定义一个。 

2.还有一些系统不能帮我们合成默认构造函数的情况,比如类内成员有的没有默认构造函数,后面会讲到(见primer 13章)。

初始值列表

class A
{
    int a = 0;
    double b = 0;   //这两句有类内初始值
    char c;
    
    A() = default;    //代表和合成的一样的行为
    A(const int &aa, const int &bb):a(aa),b(bb){}

}

高级点的 

初始值列表和构造函数内赋值的区别

初始值列表初始化等价于变量的定义和初始化,而构造函数内赋值等价于变量的定义,默认初始化和赋值。

string foo = "Hello world!";   //初始值列表

string bar;    //构造函数内赋值
bar = "Hello world!";

const成员和引用必须使用初始值列表,不能使用赋值法。

class ConstRef
{
public: 
    ConstRef(int ii);
private:
    int i;
    const int ci;
    int &ri;
};

ConstRef::ConstRef(int ii):i(ii),ci(i),ri(i) {
}

 初始化顺序

是类里定义顺序,不是初始值列表出现顺序


拷贝


赋值


析构

略,注意如果有动态内存分配,那么不能用以上三个的合成版本。

 

扫描二维码关注公众号,回复: 5886656 查看本文章

猜你喜欢

转载自blog.csdn.net/asdfghwunai/article/details/88975527