64,651
社区成员
发帖
与我相关
我的任务
分享
1、我想知道合成是什么概念,刚才在网上找了下,对合成的定义如下:当一个类的成员变量的类型是另一个类时,称之为“合成(composite)”。不知道各位高手是否认同
2、class A
{
public:
int i;
int j;
vrtual void f();
};
书上写的不会合成默认构造函数和析构函数,因为其没有成员对象
而如果
class B
{
public:
int i;
A a;
};
这样也不会合成一个默认构造函数和析构函数,因为a没有构造函数和析构函数 :出自《深度探索c++对象模型》
3、之前我对合成的概念自定义如下:
class A
{
public:
int i;
int j;
vrtual void f();
};
A a;//编译器会自动生成一个默认构造函数和析构函数,而以为合成概念就相当于生成
4、对于上述类定义,编译器会不会构造一个默认的析构函数??
如果我不需要任何A 对象,比如没有 A a等,那么编译器还不会不自动生成一个默认构造函数和析构函数
5、
如果一个类没有定义构造函数,那么编译器会生成一个默认的构造函数,那么如果一个类没定义析构函数,还会不会生成默认的析构函数
6、是不是每个类都会有一个析构函数,如果我们没定义,系统会自动生成一个默认析构函数,如果是,析构函数的作用是什么?
7、默认析构函数与默认构造函数的问题类似。即,只有在编译期需要的时候生成,目地是完成清理的工作,与空间回收无关。而且,析构函数并不一定要于构造函数配对。比如类中只是有一个虚函数的时候,就不必生成默认析构函数。所有的析构和构造对称出现的想法,都只是我们出于美学的主观臆断罢了。而对析构函数的扩展,其顺序与构造函数相反,这一点倒是符合了对称性。
上面这句话对否??为什么?
1、我想知道合成是什么概念,刚才在网上找了下,对合成的定义如下:当一个类的成员变量的类型是另一个类时,称之为“合成(composite)”。不知道各位高手是否认同
============================================
这个东西比较微妙,和组合、合成、聚合之类的很容易混淆,可以建议lz看看设计模式!我不太认同这个观点,不能这么简单的说
参考url:http://www.jdon.com/designpatterns/composite.htm
============================================
2、class A
{
public:
int i;
int j;
vrtual void f();
};
书上写的不会合成默认构造函数和析构函数,因为其没有成员对象
而如果
class B
{
public:
int i;
A a;
};
这样也不会合成一个默认构造函数和析构函数,因为a没有构造函数和析构函数 :出自《深度探索c++对象模型》
============================================
默认构造函数只有在以下之列才会被合成:
1) 当class内含一个member object 而后者的class声明有一个constructor时(不论是被class设计者明确地声明,或者是被编译器合成)。
2) 当class继承自一个base class而后者存在有一个constructor时(不论是被明确声明还是被合成所得)。
3) 当class声明了一个或多个virtual function时(需要对vptr初始化)
4) 当class派生自一个继承串链,其中有一个或多个virtual base classes时。
============================================
3、之前我对合成的概念自定义如下:
class A
{
public:
int i;
int j;
vrtual void f();
};
A a;//编译器会自动生成一个默认构造函数和析构函数,而以为合成概念就相当于生成
===========================================
参考第一个问题和第二个问题
===========================================
4、对于上述类定义,编译器会不会构造一个默认的析构函数??
如果我不需要任何A 对象,比如没有 A a等,那么编译器还不会不自动生成一个默认构造函数和析构函数
==========================================
会!
==========================================
5、
如果一个类没有定义构造函数,那么编译器会生成一个默认的构造函数,那么如果一个类没定义析构函数,还会不会生成默认的析构函数
==========================================
参考第2个问题,析构和构造是对应的,
==========================================
6、是不是每个类都会有一个析构函数,如果我们没定义,系统会自动生成一个默认析构函数,如果是,析构函数的作用是什么?
==========================================
不一定,如果需要而你又没定义,系统会自动生成一个
析构函数的作用比较多:(对应上面)
调用member obj的析构函数
调用基类的析构函数
重置vptr指针
调用虚基类的析构函数
==========================================
7、默认析构函数与默认构造函数的问题类似。即,只有在编译期需要的时候生成,目地是完成清理的工作,与空间回收无关。而且,析构函数并不一定要于构造函数配对。比如类中只是有一个虚函数的时候,就不必生成默认析构函数。所有的析构和构造对称出现的想法,都只是我们出于美学的主观臆断罢了。而对析构函数的扩展,其顺序与构造函数相反,这一点倒是符合了对称性。
上面这句话对否??为什么?
===============================
基本上正确。
参考我上面的回答
如果没有构造函数,谁来负责调用子类的默认构造函数或者数据成员的默认构造函
1楼的有问题吧???c++的标准说,必须要有必要的时候才生成啊!!
比如:
对于
class A{private : int i;int j;};
这样的类是不会生成默认构造函数的!!
别误导lz啊~~~