📜  C ++ |构造函数|问题13(1)

📅  最后修改于: 2023-12-03 15:13:45.111000             🧑  作者: Mango

C++ | 构造函数 | 问题13

简介

构造函数是在创建对象时调用的函数,它的主要作用是对对象进行初始化。C++中,默认会提供一个无参的构造函数,如果用户定义了构造函数,则默认提供的构造函数就不再起作用。

问题描述

在使用构造函数时,有一些问题需要注意:

问题1:析构函数中调用构造函数

在某些特殊情况下,可能需要在析构函数中调用构造函数。这是不被允许的,因为会导致对象被重复创建。

问题2:非静态成员变量初始化

在类中,可以使用初始化列表对成员变量进行初始化。例如:

class Test{
    int a;
public:
    Test(int i){ 
        a = i; 
    }
};

上面的代码中,a的初始化采用了先赋值再初始化的方式,这样做的问题是,如果a像下面这样定义:

class Test{
    int a;
    int b;
public:
    Test(int i){ 
        a = i; 
    }
};

当b没有被初始化时,它的值是不确定的。这时,就需要使用初始化列表:

class Test{
    int a;
    int b;
public:
    Test(int i): a(i), b(0) {} // 初始化a和b
};
问题3:静态成员变量初始化

静态成员变量是该类的所有对象所共有的,它的初始化需要特别注意。可以将静态成员变量初始化放在类声明中,也可以放在类外部进行。

class Test{
    static int a;         // 静态成员变量声明
public:
    Test(int i){ 
        a = i; 
    }
};
int Test::a = 0;         // 静态成员变量初始化
示例代码
#include <iostream>
using namespace std;

class Test{
    int a;
    int b;
    static int c;       // 静态成员变量声明
public:
    Test(int i): a(i), b(0) {} // 初始化a和b

    int getA(){ return a; }
    int getB(){ return b; }
    static int getC(){ return c; }
};

int Test::c = 999;     // 静态成员变量初始化

int main()
{
    Test t(10);

    cout << "a = " << t.getA() << endl;       // a = 10
    cout << "b = " << t.getB() << endl;       // b = 0
    cout << "c = " << Test::getC() << endl;   // c = 999

    return 0;
}
结论

在使用构造函数时,需要注意一些问题,特别是对成员变量进行初始化的问题。对于静态成员变量的初始化,可以在类声明中进行,也可以在类外部进行。