C++各种构造函数以及新建对象时是否加括号的区别


总结一下C++中类的各种构造函数,以及新建对象时是否添加括号

首先讨论各种构造函数

我们都知道,当我们不提供构造函数时,编译器会自动为我们添加一个默认无参构造函数和一个默认拷贝构造函数,例如:

class test {};
int main() {
	test A;//调用默认无参构造
	test B(A);//调用默认拷贝构造
	return 0;
}

当我们添加无参构造函数或者有参构造函数时,编译器将不再提供默认无参构造函数和但依旧会提供默认拷贝构造函数,例如:

//添加无参构造函数时
class test {
public:
	test() { cout << "无参构造" << endl;}
};
int main() {
	test A;//输出:无参构造
	test B(A);//无输出,调用默认拷贝构造
	return 0;
}
//添加有参构造函数时
class test {
public:
	int val;
	test(int _val) {
		val = _val;
		cout << "有参构造" << endl;
	}
};
int main() {
	//test A; 无法通过编译,此时没有无参构造
	test A(5);//输出:有参构造
	test B(A);//无输出,调用默认拷贝构造
	return 0;
}

而当我们添加拷贝构造函数时,编译器将不再提供任何默认构造函数,例如:

class test {
public:
	int val;
	test(int _val) {
		this->val = _val;
		cout << "有参构造" << endl;
	} //必须得添加无参构造或者有参构造,不然没法创建新对象
	test(test& T) {
		this->val = T.val;
		cout << "拷贝构造" << endl;
	}
};
int main() {
	//test A; 无法通过编译,此时没有无参构造。
	test A(5);//输出:“有参构造”
	test B(A);//输出:“拷贝构造”
	return 0;
}

新建对象时,如果使用无参构造,不添加括号。如果添加括号,编译器会认为这是函数申明,例如:

Test A;
Test A();//错误,此时编译器会认为这是函数申明,而不是无参构造

然后是new创建对象时是否添加括号

new创新新对象时,如果是内置类型,例如:int,是否添加括号都可以,添加括号会进行初始化,不添加则只是开辟空间。例如:

int* T = new int;//创建新对象,只是开辟空间
int* T = new int();//创建新对象并初始化

而对于new创建自定义对象时是否加括号,区别可以参见new对象加括号和不加括号的区别。总结就是,new创建新对象时最好加上括号

  • 8
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值