C++基本功和 Design Pattern系列(3) ctor & dtor
来源:互联网 发布:php封装继承多态 编辑:程序博客网 时间:2024/05/16 15:26
======================================================
最近实在是太忙了,无工夫写呀。只能慢慢来了。呵呵,今天Aear讲的是class.ctor
class
class
private:
public:
};
也许这是很多初学者经常写出来的代码,Aear以前也写过。让我们来看看这段代码有什么问题。
首先需要说明的是,在一个class实例化之前,所有的member都会被初始化,如果member是个class,那么那个class的constructor就会被调用。也就是说,在运行AnotherClass的constructor之前,SomeClass的constructor就已经运行了。接下来的代码里,SomeClassInstance又被重新执行了次
如果有多个类成员,可以用","来分割,如:
值得注意的是,
同理,在声明类变量被附初值的时候,使用拷贝构造函数,效率更高:
=====错误=====
class
x1
=====正确=====
class
===================分割线===================
从上面的例子可以看到,几乎所有的class,都需要提供拷贝构造函数,也就是
class1
public:
private:
}
如果class1不提供operator
void
func(x1);
这时候,c++会调用class1的拷贝构造函数,来把参数从x1里拷贝到Para,如果class1没有提供copy
这样大家就知道为什么要同时提供copy
class1
...
private:
}
这样别人在执行
还有,在声明构造函数的时候,单参数的构造函数,最好都用explicit来声明,例如:
class1
public:
};
其中class1(int
class1
的时候,因为2不是class1,所以c++会用隐性的类型转换,也就是把2转换成class1,因此会调用class1(2),然后用operator
explicit
这样做再执行
class1
===================分割线===================
在运行constructor的时候,值得注意的一点就是,如果在constructor里,要初始化会throw
class1
}
大家看的明白了吧,如果不catch
===================分割线===================
最后关于destructor,需要注意的是,如果是被继承的base
BaseClass
{
public:
}
DerivedClass
{
public:
}
BaseClass
delete
如果BaseClass的destructor是virtual,那么正确的ctor
BaseClass();
DerivedClass();
~DerivedClass();
~BaseClass();
如果不是Virtual,调用顺序是:
BaseClass();
DerivedClass();
~BaseClass();
也就是说,DerivedClass的派生类不能被正确调用,这主要是因为在delete的时候c++并不知道你delete的是
===================分割线===================
从上面的例子大家也看出来了,如果是派生类,那么就要调用基类的constructor,在多层次的派生类创建过程中,所以基类的constructor都要被调用。
也许有人会说,所有的constructor和destructor都被compiler
- C++基本功和 Design Pattern系列(3) ctor & dtor
- C++基本功和 Design Pattern系列 ctor & dtor
- C++基本功和 Design Pattern系列 ctor & dtor (转)
- C++基本功和 Design Pattern系列 virtual
- C++基本功和 Design Pattern系列 Exception
- C++基本功和 Design Pattern系列(2)
- C++基本功和 Design Pattern系列 Leaf Class Design
- C++基本功和 Design Pattern系列 Base Class Design
- C++基本功和 Design Pattern系列 Operator 上
- C++基本功和 Design Pattern系列 Operator 下
- C++基本功和 Design Pattern系列 Inheritance VS Delegation
- C++基本功和 Design Pattern系列(1) - Inheritance VS Delegation
- C++基本功和 Design Pattern系列(11) Exception
- C++基本功和 Design Pattern系列(4-6)
- C++基本功和 Design Pattern系列(7-9)
- C++基本功和 Design Pattern系列(10-11)
- C++基本功和 Design Pattern系列(1-3) - Inheritance VS Delegation
- Item 8 异常安全的ctor和dtor
- andriod多像素问题
- linux下udp大文件传输
- IP,UDP,TCP,SCTP特性比较
- 套接口类型与协议
- VMware server2 中 CentOS 进入BIOS
- C++基本功和 Design Pattern系列(3) ctor & dtor
- 关于JAVA中 war,jar,ear,包的一些概念
- C++基本功和 Design Pattern系列(2)
- Dom4j生成xml
- matlab的vectorize:将标量转化成向量
- TabActivity探索
- Linux下查看Tomcat的控制台输出信息
- ubuntu下设置apache虚拟站点及hosts开发PHP
- poj 1389 Area of Simple Polygons(线段树做法)