构造函数constructor 与析构函数destructor(二)

(1)转换构造函数

转换构造函数的定义:转换构造函数就是把普通的内置类型转换成类类型的构造函数,这种构造函数只有一个参数。只含有一个参数的构造函数,可以作为两种构造函数,一种是普通构造函数用于初始化对象,一种是转换构造函数

 1 //test.h
 2 #ifndef TEST_H
 3 #define TEST_H
 4 class Test{
 5     int m_i;
 6 public:
 7     Test(int i = 0);//转换构造函数,也是普通构造函数
 8     ~Test();
 9
10 };
11 #endif //TEST_H
12
13
14
15 //test.cpp
16 #include"Test.h"
17 #include<iostream>
18 using std::cout;
19 using std::endl;
20
21
22 Test::Test(int i) :m_i(i){
23     cout << "Test(int i):" <<"m_i="<<m_i<< endl;
24 }
25 Test::~Test(){
26     cout << "~Test()" << endl;
27
28 }
29
30
31 //demo.cpp
32
33 #include<iostream>
34 #include"Test.h"
35 int main(){
36     Test t(12);//此时调用普通构造函数,初始化t
37     t = 15;//此时调用转换构造函数把15转换成类对象,生成临时对象
38
39     return 0;
40
41 }

在上面的t=15这段代码中,会生成临时对象,那么临时对象是什么时候释放的呢?

#ifndef TEST_H
#define TEST_H
class Test{
    int m_i;
public:
    Test(int i = 0);
    ~Test();

};
#endif //TEST_H

#include"Test.h"
#include<iostream>
using std::cout;
using std::endl;

Test::Test(int i) :m_i(i){
    cout << "Test(int i):" <<"m_i="<<m_i<< endl;
}
Test::~Test(){
    cout << "~Test()" << endl;

}

#include<iostream>
#include"Test.h"
int main(){
    Test t(12);//调用构造函数,执行Test(int i):m_i=12
    t = 15;//生成临时对象,调用转换构造函数Test(int i):m_i=15,当把临时对象赋值给t后,里面调用了析构函数,把m_i值为15的临时对象释放掉
 Test t2;//调用默认构造函数,Test(int):m_i=0;  然后调用析构函数把t和t2对象释放 return 0; }

类的构造函数只有一个参数是非常危险的,因为编译器可以使用这种构造函数把参数的类型隐式转换为类类型。所以有时候我们在构造函数的前面加一个关键字explicit,这样普通的内置类型就不能隐式的转换成类对象了。

赋值运算符和初始化的区别:

 1 //在类里面加入如下的函数,对赋值运算的重载
 2 const Test& Test::operator=(const Test& vt){
 3     m_i = vt.m_i;
 4     return *this;
 5 }
 6
 7
 8
 9
10 #include<iostream>
11 #include"Test.h"
12 int main(){
13     Test t(12);//此时只会调用构造函数
14     t = 15;//会调用构造函数构造生成临时对象,临时对象向t赋值时,会调用=号的重载函数
15
16     Test t2=9;//此时只会调用构造函数,没有调用=号的重载函数
17     t2 = t;//调用=号重载,此时的=号是赋值运算符。
18     return 0;
19
20 }

根据设置断点实验,跟踪运算符重载函数和构造函数可以看到,t=15这句话是先调用构造函数,然后再调用运算符重载函数,说明是先生成临时变量,然后把临时变量赋值给t,Test t2=9这句话只调用了构造函数,所以这句话属于初始化,t2=t这句话只是调用了运算符重载函数,所以这句话中的=号是赋值。

时间: 2024-08-06 19:43:37

构造函数constructor 与析构函数destructor(二)的相关文章

构造函数constructor 与析构函数destructor(一)

构造函数定义:构造函数c++中在创建对象时自动调用,用来初始化对象的特殊函数. (1)构造函数的名字必须与类的名字相同,不能有返回值,哪怕是void 也不行. (2)通常情况下构造函数应声明为公有函数,否则它不能像其他成员函数那样被显式地调用 构造函数被声明为私有有特殊的用途,这个以后再写. (3)但是可以有参数,因为有参数,故可以被重载. 1 #ifndef TEST_H 2 #define TEST_H 3 class Test{ 4 int m_i; 5 public: 6 Test(in

构造函数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;这样的就不是初始化,是赋值.所以在初始化列表里面的初始化才是真正的初始化,即初始化阶段.而在构造函数内的那些

Python 构造函数、 Python 析构函数、Python 垃圾回收机制

构造函数与析构函数 构造函数: 用于初始化类的内容部状态,Python提供的构造函数式 __init__(); __init__()方法是可选的,如果不提供,Python 会给出默认的__init__方法 一般数据的获取需要定义的get和set方法 析构函数: 用于释放对象占用的资源,Python 提供的析构函数式__del__(); __del__()也是可选的,如果不提供,则Python 会在后台提供默认析构函数 如果要显式的调用析构函数,可以使用del关键字,方式如下: del对象名 垃圾

类String的构造函数(包含一个拷贝构造函数)、析构函数和赋值函数

每个类只有一个析构函数和一个赋值函数,但可以有多个构造函数(包含一个拷贝构造函数,其它的称为普通构造函数). class String { public: String(const char *str = NULL); // 普通构造函数 String(const String &other); // 拷贝构造函数 ~ String(void); // 析构函数 String & operate =(const String &other); // 赋值函数 // 相加函数,如果没

Java 语法 索引 ----- 构造函数(constructor)

重载 class MyRectangle{ int x, y; public MyRectangle() { x = 10; y = 20; } public MyRectangle(int a) { x = a; y = a; } public MyRectangle(int a, int b) { x = a; y = b; } } Constructor chaining public MyRectangle() { this(10,20); } public MyRectangle(in

JavaScript探秘:构造函数 Constructor

除了创建对象,构造函数(constructor) 还做了另一件有用的事情—自动为创建的新对象设置了原型对象(prototype object) .原型对象存放于 ConstructorFunction.prototype 属性中. 例如,我们重写之前例子,使用构造函数创建对象“b”和“c”,那么对象”a”则扮演了“Foo.prototype”这个角色: // 构造函数 function Foo(y) { // 构造函数将会以特定模式创建对象:被创建的对象都会有"y"属性 this.y

C#析构函数(destructor)和终结器(Finalizer) .

使用析构函数释放资源 析构函数用于析构类的实例. 1)         不能在结构中定义析构函数.只能对类使用析构函数. 2)         一个类只能有一个析构函数. 3)         无法继承或重载析构函数. 4)         无法调用析构函数.它们是被自动调用的. 5)         析构函数既没有修饰符,也没有参数. 例如,下面是类 Car 的析构函数的声明: [csharp] view plaincopy class Car { /// <summary> /// 析构函

javascript工厂函数(factory function)vs构造函数(constructor function)

如果你从其他语言转到javascript语言的开发,你会发现有很多让你晕掉的术语,其中工厂函数(factory function)和构造函数(constructor function)就是其中的一个.本文试图理顺这两者之间的区别. Factory functions 工厂函数是将返回一个新的object的任何不是类或者构造函数的函数.在js中,任何函数都能够返回一个object.如果我们不是通过new function()的方式来获得这个对象的,那么她就是一个factory工厂函数. funct

C++笔记----构造函数与析构函数(二)

构造函数是一种特殊的成员函数.在创建对象的时候自动调用,对对象的数据成员进行初始化. (1)栈区中创建的对象,在生存期结束的时候会自动调用析构函数. (2) 在堆上创建的对象,要由程序员显示调用delete释放该对象,同时调用析构造函数. (3)全局对象的构造先于main函数.全局对象在其生存期结束的时候也会自动调用析构造函数,对对象进行释放. 构造函数的作用:初始化.类型转化(转换构造函数) 1.转换构造函数 定义:转换构造函数是单个参数的构造函数 作用:将其他类型转换成类类型 类的构造函数只