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 对象加上括号()时, 其类内部数据成员才会被定义,其余情况都是未定义行为!
尽量为该类编写构造函数并进行一系列的初始化和赋值操作,不要依赖系统默认未定义行为。
尽量为该类编写构造函数并进行一系列的初始化和赋值操作,不要依赖系统默认未定义行为。
尽量为该类编写构造函数并进行一系列的初始化和赋值操作,不要依赖系统默认未定义行为。
本文来自博客园,作者:想想就很离谱,转载请注明原文链接:https://www.cnblogs.com/lvvou/p/14974734.html

浙公网安备 33010602011771号