gpt4 book ai didi

c++ - 构造和初始化列表 : what the compiler do?

转载 作者:太空狗 更新时间:2023-10-29 20:28:23 25 4
gpt4 key购买 nike

我对 C++ 中的构造函数有一些疑问。对于每个问题(从 (1) 到 (4)),我想知道是否根据标准完美定义了行为。

A)第一个是关于成员的初始化:

class Class
{
public:
Class()
: _x(0)
, _y(_x)
, _z(_y) // <- (1) Can I initialize a member with other members ?
{
;
}

protected:
int _x;
int _y;
int _z;
};

B) 编译器为每个类添加了哪些功能?

template<typename T> class Class
{
public:
template<typename T0>
Class(const Class<T0>& other)
{
std::cout<<"My copy constructor"<<std::endl;
_x = other._x;
}

template<typename T0 = T>
Class (const T0 var = 0)
{
std::cout<<"My normal constructor"<<std::endl;
_x = var;
}

public:
T _x;
};

// (2) Are
// Class(const Class<T>& other)
// AND
// inline Class<T>& operator=(const Class<T>& other)
// the only functions automatically added by the compiler ?

例如,如果我调用:

Class<int> a;
Class<int> b(a); // <- Will not write "My copy constructor"
Class<double> c(a); // <- Will write "My copy constructor"

(3) 根据标准,这种行为是否完全正常?

(4) 我是否可以保证不会自动添加一个空的构造函数并且 Class<int> x;会写"My normal constructor"

最佳答案

Can I initialize a member with other members ?

是的,只要那些其他成员已经被初始化;即只要他们的声明在成员初始化之前就可以了。

Are [the copy constructor] and [the copy-assignment operator] the only functions automatically added by the compiler ?

它还将隐式声明一个析构函数,它将销毁_x。使用它的析构函数。

在 C++11 中,移动构造函数 (Class(Class&&)) 和移动赋值运算符 (Class& operator=(Class&&)) 也是隐式声明的,除非您声明复制或移动构造函数,或者复制或移动赋值运算符。

请注意,您的构造函数模板不是复制构造函数,而是使用隐式构造函数:

Class<T1> t1;
Class<T1>(t1); // prints nothing
Class<T2>(t1); // prints "My copy constructor" (which is a lie)

Is this behaviour perfectly normal according to the standard ?

是的,请参阅第 12 章。

Do I have the guarantee that an empty constructor is not automatically added and that Class<int> x; will write "My normal constructor" ?

是的,只有当您根本不声明任何构造函数时,才会隐式声明默认构造函数。

关于c++ - 构造和初始化列表 : what the compiler do?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13372814/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com