C++ 中创建对象时加括号 () 与不加括号 () 分析

前言

很多时候,我们会看到一些在创建对象时有的加括号有的不加括号

那么,这是什么情况呢?

我们来验证一下。

1.基本数据类型不带括号()

#include <iostream>
using namespace std;

int main(int arg, char **argv)
{
	int a;
	cout << "a=" << a << endl;
	return 0;
}

调试结果:

2.基本数据类型带括号()

#include <iostream>
using namespace std;

int main(int arg, char **argv)
{
	int a();   // 这是一个返回值为 int 无参数的函数;
	return 0;
}

调试结果: 看注释

3.基本数据类型new创建不带括号()

#include <iostream>
using namespace std;

int main(int arg, char **argv)
{
	int *a = new int;
	cout << "a=" << *a << endl;
	return 0;
}

调试结果:这是个随机值

4.基本数据类型new创建带括号()

#include <iostream>
using namespace std;

int main(int arg, char **argv)
{
	int *a = new int();
	cout << "a=" << *a << endl;
	return 0;
}

调试结果:被初始化为 0

5.自定义数据类型不带括号(),不提任何供构造函数

#include <iostream>
using namespace std;

class A {
public:
	int value;
};

int main(int arg, char **argv)
{
	A a;
	cout << "value=" << a.value << endl;
	return 0;
}

调试结果:

6.自定义数据类型带括号(),不提任何供构造函数

#include <iostream>
using namespace std;

class A {
public:
	int value;
};

int main(int arg, char **argv)
{
	A a(); // 这是一个返回值类型为A的无参数函数
	return 0;
}

调试结果: 看注释

7.自定义数据类型new创建不带括号(),不提任何供构造函数

#include <iostream>
using namespace std;

class A {
public:
	int value;
};

int main(int arg, char **argv)
{
	A *a = new A;
	cout << "value=" << a->value << endl;
	return 0;
}

调试结果:

8.自定义数据类型new创建带括号(),不提任何供构造函数

#include <iostream>
using namespace std;

class A {
public:
	int value;
};

int main(int arg, char **argv)
{
	A *a = new A();
	cout << "value=" << a->value << endl;
	return 0;
}

调试结果:

9.自定义数据类型不带括号(),提供构造函数

#include <iostream>
using namespace std;

class A {
public:
	A() {};

public:
	int value;
};

int main(int arg, char **argv)
{
	A a;
	cout << "value=" << a.value << endl;
	return 0;
}

调试结果:

10.自定义数据类型带括号(),提供构造函数

#include <iostream>
using namespace std;

class A {
public:
	A() {};

public:
	int value;
};

int main(int arg, char **argv)
{
	A a();// 这是一个返回值类型为A的无参数函数
	//cout << "value=" << a.value << endl;
	return 0;
}

调试结果: 看注释

11.自定义数据类型new创建不带括号(),提供构造函数

#include <iostream>
using namespace std;

class A {
public:
	A() {};

public:
	int value;
};

int main(int arg, char **argv)
{
	A *a = new A;
	cout << "value=" << a->value << endl;
	return 0;
}

调试结果:

12.自定义数据类型new创建带括号(),提供构造函数

#include <iostream>
using namespace std;

class A {
public:
	A() {};

public:
	int value;
};

int main(int arg, char **argv)
{
	A *a = new A();
	cout << "value=" << a->value << endl;
	return 0;
}

调试结果:

13.自定义数据类型new创建带括号(),提供构造函数,并是全局对象

#include <iostream>
using namespace std;

class A {
public:
	A() {};

public:
	int value;
};

A *a = new A();
int main(int arg, char **argv)
{	
	cout << "value=" << a->value << endl;
	return 0;
}

调试结果:

总结: 在编写类时,只有在不给该类显式提供构造函数并在 new 对象加上括号()时, 其类内部数据成员才会被定义,其余情况都是未定义行为!

尽量为该类编写构造函数并进行一系列的初始化和赋值操作,不要依赖系统默认未定义行为。

尽量为该类编写构造函数并进行一系列的初始化和赋值操作,不要依赖系统默认未定义行为。

尽量为该类编写构造函数并进行一系列的初始化和赋值操作,不要依赖系统默认未定义行为。

posted @ 2021-07-05 22:38  想想就很离谱  阅读(1316)  评论(0)    收藏  举报