new 对象时加不加括号的区别(c++对象)
2015-04-02 15:27
302 查看
广泛言论:加括号调用没有参数的构造函数,不加括号调用默认构造函数或唯一的构造函数。
如果该类没有定义构造函数(由编译器合成默认构造函数)也没有虚函数,那么class
c = new class;将不调用合成的默认构造函数,(为什么不调用?)而class c = new class();则会调用默认构造函数。
(编译器合成的默认构造函数:
生成:如果用户定义的类中没有显式的定义任何构造函数,编译器就会自动为该类型生成默认构造函数,称为合成的构造函数(synthesized
default constructor)。
调用:如果定义某个类的变量时没有提供初始化式就会使用默认构造函数
例外:
1.一个类显式地声明了任何构造函数,编译器不生成公有的默认构造函数。这这种情况下,如果程序需要一个默认构造函数,需要由类的设计者提供。
2.一个类声明了一个非公有的默认构造函数,编译器不会生成公有的默认构造函数。
总之就是:构造者已经定义声明了构造函数(公有或是私有)后,编译器就不会生成默认构造函数。
)
如果该类定义了默认构造函数,那么class c = nw clases;和class c = new class();一样,都会调用默认构造函数。
对于内置类型:
int *a = new int;不会将申请到的int空间初始化,而int *a = new int();则会将申请到的int空间初始化为0。
以下两个语句的区别是:第一个动态申请的空间里面的值是随机值,第二个进行了初始化,里面的值为0:
[cpp] view
plaincopyprint?
int *p1 = new int[10];
int *p2 = new int[10]();
结论:别使用不带括号的new。
[cpp] view
plaincopyprint?
class A{
public:
//A(){a=1;}
public:
int a;
};
A *a1=new A;
A *a2=new A();
cout<<a1->a<<endl; //输出:-842150451
cout<<a2->a<<endl; //输出0
A a3;
cout<<a3.a<<endl; //运行异常,a没有初始化。
如果加上一个virtual,如virtual ~A(){},
则
[cpp] view
plaincopyprint?
cout<<a1->a<<endl; //输出:-842150451
cout<<a2->a<<endl; //输出 -842150451
-------------下面是网上找的帖子,对理解上面的现象可能会有帮助-------------------
一个类满足下列其中任何一个条件:
1.包含了一个类的对象,这个对象有一个构造函数(包括编译器合成的默认构造函数)
2.如果继承自一些基类,其中某些基类有一个构造函数(包括编译器合成的默认构造函数)
3.有一个虚函数,或者继承到了虚函数
4.有虚基类
如果这个类没有默认的构造函数,编译器就会合成一个默认的构造函数,分别做以下事情
如果这个类有构造函数,编译器就会扩张所有构造函数,做以下事情
1.调用这个对象的构造函数
2.调用基类的构造函数
3.设置正确的虚函数表指针
4.设置指向虚基类对象的指针
如果该类没有定义构造函数(由编译器合成默认构造函数)也没有虚函数,那么class
c = new class;将不调用合成的默认构造函数,(为什么不调用?)而class c = new class();则会调用默认构造函数。
(编译器合成的默认构造函数:
生成:如果用户定义的类中没有显式的定义任何构造函数,编译器就会自动为该类型生成默认构造函数,称为合成的构造函数(synthesized
default constructor)。
调用:如果定义某个类的变量时没有提供初始化式就会使用默认构造函数
例外:
1.一个类显式地声明了任何构造函数,编译器不生成公有的默认构造函数。这这种情况下,如果程序需要一个默认构造函数,需要由类的设计者提供。
2.一个类声明了一个非公有的默认构造函数,编译器不会生成公有的默认构造函数。
总之就是:构造者已经定义声明了构造函数(公有或是私有)后,编译器就不会生成默认构造函数。
)
如果该类定义了默认构造函数,那么class c = nw clases;和class c = new class();一样,都会调用默认构造函数。
对于内置类型:
int *a = new int;不会将申请到的int空间初始化,而int *a = new int();则会将申请到的int空间初始化为0。
以下两个语句的区别是:第一个动态申请的空间里面的值是随机值,第二个进行了初始化,里面的值为0:
[cpp] view
plaincopyprint?
int *p1 = new int[10];
int *p2 = new int[10]();
结论:别使用不带括号的new。
[cpp] view
plaincopyprint?
class A{
public:
//A(){a=1;}
public:
int a;
};
A *a1=new A;
A *a2=new A();
cout<<a1->a<<endl; //输出:-842150451
cout<<a2->a<<endl; //输出0
A a3;
cout<<a3.a<<endl; //运行异常,a没有初始化。
如果加上一个virtual,如virtual ~A(){},
则
[cpp] view
plaincopyprint?
cout<<a1->a<<endl; //输出:-842150451
cout<<a2->a<<endl; //输出 -842150451
-------------下面是网上找的帖子,对理解上面的现象可能会有帮助-------------------
一个类满足下列其中任何一个条件:
1.包含了一个类的对象,这个对象有一个构造函数(包括编译器合成的默认构造函数)
2.如果继承自一些基类,其中某些基类有一个构造函数(包括编译器合成的默认构造函数)
3.有一个虚函数,或者继承到了虚函数
4.有虚基类
如果这个类没有默认的构造函数,编译器就会合成一个默认的构造函数,分别做以下事情
如果这个类有构造函数,编译器就会扩张所有构造函数,做以下事情
1.调用这个对象的构造函数
2.调用基类的构造函数
3.设置正确的虚函数表指针
4.设置指向虚基类对象的指针
相关文章推荐
- new 对象时加不加括号的区别(c++对象)
- new对象时,类名后加括号与不加括号的区别
- new 对象加括号和不加括号的区别
- C++中new 一个对象的时候加括号和不加括号的区别
- new对象时,类名后加括号与不加括号的区别
- new 对象加括号和不加括号的区别
- new对象时,类名后加括号与不加括号的区别
- new对象时,类名后加括号与不加括号的区别
- new对象时,类名后加括号与不加括号的区别
- new对象时,类名后加括号与不加括号的区别
- new 对象加括号和不加括号的区别
- php中new对象加括号和不加括号的区别
- new 对象加括号和不加括号的区别
- new对象加括号与不加的区别
- 【转】new对象时,类名后加括号和不加括号的区别
- C++ new 创建对象加不加括号的区别以及用new创建对象的特点
- new 对象加括号和不加括号的区别
- php new 对象是否带括号的区别
- C++中new 一个对象的时候加括号和不加括号的区别
- new 一个对象的时候加括号和不加括号有什么区别