构造函数constructor 与析构函数destructor(三)
(1)构造函数初始化列表:
1 class Test{
2 int i;
3 public:
4 Test(int vi):i(vi){}//这里的从冒号开始,到右大括号结束,这一段是构造函数初始化列表
5
6 };
构造函数的执行分为两个阶段:(1)初始化阶段 (2)普通计算阶段
初始化是我们定义一个变量,分配内存时直接给变量赋值,例如 int i=10; 而int k; k=10;这样的就不是初始化,是赋值。所以在初始化列表里面的初始化才是真正的初始化,即初始化阶段。而在构造函数内的那些是赋值操作,即普通计算阶段。
(1)const 成员变量的初始化,只能在构造函数初始化列表初始化,其实在其定义处也可以直接初始化
class Object{
const int i;//const成员变量
public:
Object(int vi):i(vi){}//在初始化列表中对const成员变量初始化
};
(2)引用成员变量的初始化,也只能在构造函数初始化列表中进行
class Object{
int N;
int& refN;//引用成员变量
public:
Object():refN(N){}//在构造函数初始化列表处对引用成员变量初始化
};
(3)对象成员的初始化,如果子对象没有默认构造函数,也只能放在外部类的构造函数初始化列表初始化。
class Object{
int m_i;
public:
Object(int vi):m_i(vi){}
};
class Container{
Object obj;
public:
Container(){}
};
int main(){
Container cn;//这句话会报错误,因为在创建Container对象时,会先创建Object的对象,此时会调用Object的默认构造函数 ,但是我们在Object类里面并没有定义默认构造函数。
return ;
}
所以上面的问题有两个解决版本,一是在Object类中添加默认构造函数,二是在Container构造函数初始化列表中,像obj(0)这样初始化obj对象。
如果一个类中包含对象成员,那么再构造时,先构造对象成员,然后再构造外部对象。 并且一个类中包含多个对象成员,这些对象成员的构造顺序是和定义顺序一致的。在析构对象成员时,和定义的顺序相反。
还有就是先析构外部对象,再析构内部子对象。
(4)如果要定义一个对所有对象都是常量的成员,可以采用两种形式 一,是const static int 二,是enum枚举
class Object{
const static int N=;
enum E_Type{
TYPE_A=;
};
int a[N];
int b[TYPE_A];
public:
};
构造函数constructor 与析构函数destructor(三)的更多相关文章
- 构造函数constructor 与析构函数destructor(五)
我们知道当调用默认拷贝构造函数时,一个对象对另一个对象初始化时,这时的赋值时逐成员赋值.这就是浅拷贝,当成员变量有指针时,浅拷贝就会在析构函数那里出现问题.例如下面的例子: //test.h #ifn ...
- 构造函数constructor 与析构函数destructor(一)
构造函数定义:构造函数c++中在创建对象时自动调用,用来初始化对象的特殊函数. (1)构造函数的名字必须与类的名字相同,不能有返回值,哪怕是void 也不行. (2)通常情况下构造函数应声明为公有函数 ...
- 构造函数constructor 与析构函数destructor(四)
拷贝构造函数:拷贝构造函数就是在用一个类对象来创建另外一个类对象时被调用的构造函数,如果我们没有显示的提供拷贝构造函数,编译器会隐式的提供一个默认拷贝构造函数. 拷贝构造函数的定义是X(const X ...
- 构造函数constructor 与析构函数destructor(二)
(1)转换构造函数 转换构造函数的定义:转换构造函数就是把普通的内置类型转换成类类型的构造函数,这种构造函数只有一个参数.只含有一个参数的构造函数,可以作为两种构造函数,一种是普通构造函数用于初始化对 ...
- 从零开始学C++之构造函数与析构函数(三):深拷贝与浅拷贝、空类
一.深拷贝与浅拷贝 说得简单点,假设一个类有指针成员,如果在拷贝的时候顺带连指针指向的内存也分配了,就称为深拷贝:如果只是分配指针本身的内存,那就是浅拷贝.浅拷贝造成的问题是有两个指针指向同块内存,d ...
- GCC的__attribute__ ((constructor))和__attribute__ ((destructor))
通过一个简单的例子介绍一下gcc的__attribute__ ((constructor))属性的作用.gcc允许为函数设置__attribute__ ((constructor))和__attrib ...
- javascript工厂函数(factory function)vs构造函数(constructor function)
如果你从其他语言转到javascript语言的开发,你会发现有很多让你晕掉的术语,其中工厂函数(factory function)和构造函数(constructor function)就是其中的一个. ...
- C++笔记----构造函数与析构函数(三)
1.构造函数初始化列表 推荐在构造函数初始化列表中进行初始化 构造函数的执行分为两个阶段:初始化段. 普通计算段 2.对象成员及其初始化 #include<iostream> using ...
- 【转】c++析构函数(Destructor)
创建对象时系统会自动调用构造函数进行初始化工作,同样,销毁对象时系统也会自动调用一个函数来进行清理工作,例如释放分配的内存.关闭打开的文件等,这个函数就是析构函数. 析构函数(Destructor)也 ...
随机推荐
- sqoop1的安装以及数据导入导出测试
下载 wget http://mirror.bit.edu.cn/apache/sqoop/1.4.7/sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz 解压 tar -zxf ...
- ajax的一些小知识
eval()可以把一个字符串转化为本地的js代码来执行 <script type="text/javascript"> var str = "alert('h ...
- 浅谈Matcher和pattern的使用
这两个类位于java.util.regex包下,主要用于实现正则表达式 Pattern类用于创建一个正则表达式,也可以说是创建一个匹配模式 两个静态方法创建:compile(String regex) ...
- VBA 使用QueryTables 中文乱码的处理
一般情况: cnn = "OLEDB;Provider=IBMDA400;Data Source=TFB4001;User ID=;Password=;" Sql = " ...
- selector 模块
selector 模块进行自动匹配,当是windows系统时,自动匹配select, linux系统时,自动匹配epoll,传输时会明确告诉内核响应服务器的地址,速度要更快 import select ...
- UI5-文档-4.5-Controllers
在这个步骤中,我们将文本替换为一个按钮,并在按钮被按下时显示“Hello World”消息.按钮的按下事件的处理是在视图的控制器中实现的. Preview A Say Hello button is ...
- ubuntu查询可用安装包
当使用apt-get install packages时,如果不知道安装包的具体名称,可以使用关键字进行搜索,使用:apt-cache search keywords
- Haskell语言学习笔记(53)Data.Sequence
Data.Sequence Prelude> import Data.Sequence as Seq Prelude Seq> :set -XOverloadedLists Prelude ...
- Haskell语言学习笔记(39)Category
Category class Category cat where id :: cat a a (.) :: cat b c -> cat a b -> cat a c instance ...
- 向数据库添加学生信息。存放在REQUEST对象里
代码前几天已经发过了,但是程序一直还没运行出来,今天重新建立了一个数据库,才可以,下面补充上数据截图