C++——深入构造函数
2017-02-09 16:22
239 查看
1.转换构造函数
转换构造函数就是单个参数的构造函数
转换构造函数的作用是将其他类型转换为类类型
类的构造函数只有一个参数是非常危险的,因为编译器可以使用这种构造函数把参数的类型隐式转换为类类型
2.初始化和赋值
在初始化语句中的等号不是运算符。编译器对这种语法有特殊的解释
而赋值使用的语法为Test& Test::operator = (const Test& other)
我们可以将赋值使用的运算符重载函数自己编写,通过查看打印结果来确定赋值是否调用了这个函数
下面用一个例子来证明上面两个知识点
首先,还是分别写Test.h和Test.cpp两个文件,在类中既有默认构造函数,构造函数,也有转换构造函数
#ifndef _TEST_H_
#define _TEST_H_
class Test
{
public:
Test();
Test(int x);
Test(int x, int y, int z);
~Test();
void displayXYZ();
Test& operator=(const Test& other);
private:
int x_;
int y_;
int z_;
protected:
};
#endif
接下来编写main函数,分别对对象进行初始化和赋值,我们通过打印结果来看一下在赋值过程中编译器到底做了哪些事
#include "Test.h"
#include <iostream>
int main()
{
Test t1(10);
t1 = 20;
t1.displayXYZ();
return 0;
}
从结果我们可以看出首先对t1进行了初始化,调用的是转换构造函数
接着开始执行赋值操作,而实际上赋值操作又可以分解为以下的操作:
①调用转换构造函数将右值这个整数转换为类类型(生成一个临时对象Test(20))
②将临时对象赋值给左值(调用的是=运算符)
③析构临时对象
所以我们能够看到第二次调用完转换构造函数之后就直接出现了析构语句的提示
而转换构造函数只对x_这个变量进行了赋值,y_和z_变量初始化成随机值
3.explicit关键字
Explicit关键字是只提供给类的构造函数使用的关键字
它的作用是编译器不会把声明为explicit的构造函数用于隐式转换,它只能在程序代码中显示创建对象
4.初始化列表
一般推荐在构造函数初始化列表中进行初始化
实际上构造函数的执行分为两个阶段:初始化段和普通计算段
有一些情况的初始化只能放在初始化列表中进行(每个构造函数都要初始化)
①类中有const成员时
②类中有引用成员时
③类中一个成员里含有另一个类的对象时(对象所对应的类没有默认构造函数)
5.访问类中的枚举对象
类名::枚举成员
转换构造函数就是单个参数的构造函数
转换构造函数的作用是将其他类型转换为类类型
类的构造函数只有一个参数是非常危险的,因为编译器可以使用这种构造函数把参数的类型隐式转换为类类型
2.初始化和赋值
在初始化语句中的等号不是运算符。编译器对这种语法有特殊的解释
而赋值使用的语法为Test& Test::operator = (const Test& other)
我们可以将赋值使用的运算符重载函数自己编写,通过查看打印结果来确定赋值是否调用了这个函数
下面用一个例子来证明上面两个知识点
首先,还是分别写Test.h和Test.cpp两个文件,在类中既有默认构造函数,构造函数,也有转换构造函数
#ifndef _TEST_H_
#define _TEST_H_
class Test
{
public:
Test();
Test(int x);
Test(int x, int y, int z);
~Test();
void displayXYZ();
Test& operator=(const Test& other);
private:
int x_;
int y_;
int z_;
protected:
};
#endif
#include "Test.h" #include <iostream> using namespace std; Test::Test() { cout << "Default Init" << endl; } Test::Test(int x) { x_ = x; cout << "Conversion Init!" << endl; } Test::Test(int x, int y, int z) { x_ = x; y_ = y; z_ = z; cout << "Init x = " << x_ << endl; } Test::~Test() { cout << "Destroy x = " << x_ << endl; } void Test::displayXYZ() { cout << "x_ = " << x_ << endl; cout << "y_ = " << y_ << endl; cout << "z_ = " << z_ << endl; } Test& Test::operator=(const Test& other) { cout << "Test::operator = " << endl; if(this == &other) { return *this; } x_ = other.x_; return *this; }
接下来编写main函数,分别对对象进行初始化和赋值,我们通过打印结果来看一下在赋值过程中编译器到底做了哪些事
#include "Test.h"
#include <iostream>
int main()
{
Test t1(10);
t1 = 20;
t1.displayXYZ();
return 0;
}
从结果我们可以看出首先对t1进行了初始化,调用的是转换构造函数
接着开始执行赋值操作,而实际上赋值操作又可以分解为以下的操作:
①调用转换构造函数将右值这个整数转换为类类型(生成一个临时对象Test(20))
②将临时对象赋值给左值(调用的是=运算符)
③析构临时对象
所以我们能够看到第二次调用完转换构造函数之后就直接出现了析构语句的提示
而转换构造函数只对x_这个变量进行了赋值,y_和z_变量初始化成随机值
3.explicit关键字
Explicit关键字是只提供给类的构造函数使用的关键字
它的作用是编译器不会把声明为explicit的构造函数用于隐式转换,它只能在程序代码中显示创建对象
4.初始化列表
一般推荐在构造函数初始化列表中进行初始化
实际上构造函数的执行分为两个阶段:初始化段和普通计算段
有一些情况的初始化只能放在初始化列表中进行(每个构造函数都要初始化)
①类中有const成员时
②类中有引用成员时
③类中一个成员里含有另一个类的对象时(对象所对应的类没有默认构造函数)
5.访问类中的枚举对象
类名::枚举成员
相关文章推荐
- 深入探索C++对象模型笔记之四 —— 构造函数语意学 (Copy Constructor的建构操作)
- 深入C++构造函数
- 深入C++中构造函数、拷贝构造函数、赋值操作符、析构函数的调用过程总结
- 深入探索C++对象模型之二 --- 构造函数语意学
- 深入理解C++对象模型之构造函数
- 深入解析C++构造函数与析构函数
- C++之深入讨论构造函数
- 深入解析C++中派生类的构造函数
- 深入讲解C++中的构造函数
- 《深入探索C++对象模型》第二章:构造函数语意学(下)
- 深入C++构造函数
- 深入搜索C++对象模型------构造函数
- 深入探索C++对象模型:第二章构造函数语意学
- 深入理解c++构造函数, 复制构造函数和赋值函数重载(operator=)
- 【深入理解C++】从初始化列表和构造函数谈C++的初始化机制
- 深入探索C++对象模型笔记之五 —— 构造函数语意学 (成员们的初始化队伍 Member Initialization List)
- 深入探索C++对象模型 第二章 构造函数语意学
- 【c++primer——】第13章复制控制——01深入理解复制构造函数
- C++ 构造函数深入理解
- C++ 深入理解系列-构造函数的技巧