1构造函数和析构函数的概念

有关构造函数

1构造函数定义及调用

1)C++中的类可以定义与类名相同的特殊成员函数,这种与类名相同的成员函数叫做构造函数;

2)构造函数在定义时可以有参数;

3)没有任何返回类型的声明。

2构造函数的调用

自动调用:一般情况下C++编译器会自动调用构造函数

手动调用:在一些情况下则需要手工调用构造函数

有关析构函数

3)析构函数定义及调用

1)C++中的类可以定义一个特殊的成员函数清理对象,这个特殊的成员函数叫做析构函数

语法:~ClassName()

2)析构函数没有参数也没有任何返回类型的声明

3)析构函数在对象销毁时自动被调用

4)析构函数调用机制

C++编译器自动调用

构造函数的分类及调用

C++编译器给程序员提供的对象初始化方案,高端大气上档次。

//有参数构造函数的三种调用方法

class Test

{

private:

int a;

int b;

public:

//无参数构造函数

Test()

{

;

}

//带参数的构造函数

Test(int a, int b)

{

;

}

//赋值构造函数

Test(const Test &obj)

{

;

}

public:

void init(int _a, int _b)

{

a = _a;

b = _b;

}

};

1无参数构造函数

调用方法: Test t1, t2;

2有参构造函数

有参构造函数的三种调用方法

//有参数构造函数的三种调用方法

class Test5

{

private:

int a;

public:

//带参数的构造函数

Test5(int a)

{

printf("\na:%d", a);

}

Test5(int a, int b)

{

printf("\na:%d b:%d", a, b);

}

public:

};

int main55()

{

Test5 t1(10);  //c++编译器默认调用有参构造函数 括号法

Test5 t2 = (20, 10); //c++编译器默认调用有参构造函数 等号法

Test5 t3 = Test5(30); //程序员手工调用构造函数 产生了一个对象 直接调用构造构造函数法

system("pause");

return 0;

}

3拷贝构造函数调用时机(用一个对象初始化另一个对象时)

赋值构造函数的四种调用场景(调用时机)

第1和第2个调用场景

#include "iostream"

using namespace std;

class AA

{

public:

AA() //无参构造函数 默认构造函数

{

cout<<"我是构造函数,自动被调用了"<<endl;

}

AA(int _a) //无参构造函数 默认构造函数

{

a = _a;

}

AA(const AA &obj2)

{

cout<<"我也是构造函数,我是通过另外一个对象obj2,来初始化我自己"<<endl;

a = obj2.a + 10;

}

~AA()

{

cout<<"我是析构函数,自动被调用了"<<endl;

}

void getA()

{

printf("a:%d \n", a);

}

protected:

private:

int a;

};

//单独搭建一个舞台

void ObjPlay01()

{

AA a1; //变量定义

//赋值构造函数的第一个应用场景

//用对象1 初始化 对象2

AA a2 = a1; //定义变量并初始化 //初始化法

a2 = a1; //用a1来=号给a2 编译器给我们提供的浅copy

}

第二个应用场景

//单独搭建一个舞台

void ObjPlay02()

{

AA a1(10); //变量定义

//赋值构造函数的第一个应用场景

//用对象1 初始化 对象2

AA a2(a1); //定义变量并初始化 //括号法

//a2 = a1; //用a1来=号给a2 编译器给我们提供的浅copy

a2.getA();

}

//注意:初始化操作 和 等号操作 是两个不同的概念

第3个调用场景

#include "iostream"

using namespace std;

class Location

{

public:

Location( int xx = 0 , int yy = 0 )

{

X = xx ;  Y = yy ;  cout << "Constructor Object.\n" ;

}

Location( const Location & p )            //复制构造函数

{

X = p.X ;  Y = p.Y ;   cout << "Copy_constructor called." << endl ;

}

~Location()

{

cout << X << "," << Y << " Object destroyed." << endl ;

}

int  GetX () { return X ; }          int GetY () { return Y ; }

private :   int  X , Y ;

} ;

//alt + f8 排版

void f ( Location  p )

{

cout << "Funtion:" << p.GetX() << "," << p.GetY() << endl ;

}

void mainobjplay()

{

Location A ( 1, 2 ) ;  //形参是一个元素,函数调用,会执行实参变量初始化形参变量

f ( A ) ;

}

void main()

{

mainobjplay();

system("pause");

}

第4个调用场景

第四个应用场景

#include "iostream"

using namespace std;

class Location

{

public:

Location( int xx = 0 , int yy = 0 )

{

X = xx ;  Y = yy ;  cout << "Constructor Object.\n" ;

}

Location( const Location & p )            //复制构造函数

{

X = p.X ;  Y = p.Y ;   cout << "Copy_constructor called." << endl ;

}

~Location()

{

cout << X << "," << Y << " Object destroyed." << endl ;

}

int  GetX () { return X ; }          int GetY () { return Y ; }

private :   int  X , Y ;

} ;

//alt + f8 排版

void f ( Location  p )

{

cout << "Funtion:" << p.GetX() << "," << p.GetY() << endl ;

}

Location g()

{

Location A(1, 2);

return A;

}

//对象初始化操作 和 =等号操作 是两个不同的概念

//匿名对象的去和留,关键看,返回时如何接

void mainobjplay()

{

//若返回的匿名对象,赋值给另外一个同类型的对象,那么匿名对象会被析构

//Location B;

//B = g();  //用匿名对象 赋值 给B对象,然后匿名对象析构

//若返回的匿名对象,来初始化另外一个同类型的对象,那么匿名对象会直接转成新的对象

Location B = g();

cout<<"传智扫地僧测试"<<endl;

}

void main()

{

mainobjplay();

system("pause");

}

 

4默认构造函数

二个特殊的构造函数

1)默认无参构造函数

当类中没有定义构造函数时,编译器默认提供一个无参构造函数,并且其函数体为空

2)默认拷贝构造函数

当类中没有定义拷贝构造函数时,编译器默认提供一个默认拷贝构造函数,简单的进行成员变量的值复制

3.3构造函数调用规则研究

1)当类中没有定义任何一个构造函数时,c++编译器会提供默认无参构造函数和默认拷贝构造函数

2)当类中定义了拷贝构造函数时,c++编译器不会提供无参数构造函数

3) 当类中定义了任意的非拷贝构造函数(即:当类中提供了有参构造函数或无参构造函数),c++编译器不会提供默认无参构造函数

4 )默认拷贝构造函数成员变量简单赋值

总结:只要你写了构造函数,那么你必须用。

构造析构阶段性总结

1)构造函数是C++中用于初始化对象状态的特殊函数

2)构造函数在对象创建时自动被调用

3)构造函数和普通成员函数都遵循重载规则

4)拷贝构造函数是对象正确初始化的重要保证

5)必要的时候,必须手工编写拷贝构造函数

========》1个对象的初始化讲完了,增加一个案例。

c++——对象的构造和析构函数、构造函数的分类及调用的更多相关文章

  1. C++ //构造函数的分类及调用 //分类 // 按照参数分类 无参构造函数(默认构造) 有参构造函数 //按照类型分类 普通构造 拷贝构造

    1 //构造函数的分类及调用 2 //分类 3 // 按照参数分类 无参构造函数(默认构造) 有参构造函数 4 //按照类型分类 普通构造 拷贝构造 5 6 #include <iostream ...

  2. C++ 的全局构造与析构函数

    我们知道一般的C/C++ 的程序是从main函数开始的,然后在main函数结束后程序结束.但是不然,在main函数开始执行前,已经有其他的指令被执行了. 为了程序的顺利执行,首先要初始化执行环境,比如 ...

  3. C++深度解析教程学习笔记(6)对象的构造和销毁

    1. 对象的初始化 (1)从程序设计的角度看,对象只是变量,因此: ①在栈上创建对象时,成员变量初始化为随机值 ②在堆上创建对象时,成员变量初始化为随机值 ③在静态存储区创建对象时,成员变量初始化为 ...

  4. C++中对象的构造顺序

    1,C++ 中的类可以定义多个对象,那么对象构造顺序是怎样的? 1,很多的 bug 是由对象的构造顺序造成的,虽然它不难: 2,对象的构造往往和构造函数牵涉在一起,构造函数的函数体又可能由非常复杂的程 ...

  5. c++类与对象(1)——构造,复制构造函数

    CPP的类与对象: 当我们定义一个基本类型变量时,方法如下: int p; #定义一个int类型变量 bool b; #定义一个bool类型变量 float c ; #定义一个float类型变量 显然 ...

  6. EC笔记,第二部分:9.不在构造、析构函数中调用虚函数

    9.不在构造.析构函数中调用虚函数 1.在构造函数和析构函数中调用虚函数会产生什么结果呢? #; } 上述程序会产生什么样的输出呢? 你一定会以为会输出: cls2 make cls2 delete ...

  7. .net学习之类与对象、new关键字、构造函数、常量和只读变量、枚举、结构、垃圾回收、静态成员、静态类等

    1.类与对象的关系类是对一类事务的统称,是抽象的,不能拿来直接使用,比如汽车,没有具体指哪一辆汽车对象是一个具体存在的,看的见,摸得着的,可以拿来直接使用,比如我家的那辆刚刚买的新汽车,就是具体的对象 ...

  8. C++箴言:避免构造或析构函数中调用虚函数

    如果你已经从另外一种语言如C#或者Java转向了C++,你会觉得,避免在类的构造函数或者析构函数中调用虚函数这一原则有点违背直觉.但是在C++中,违反这个原则会给你带来难以预料的后果和无尽的烦恼. 正 ...

  9. C++程序设计方法3:派生类对象的构造和析构过程

    基类中的数据成员,通过继承成为派生类对象的一部分,需要在构造派生类对象的过程中调用基类构造函数来正确初始化: 若没有显示调用,则编译器会自动生成一个对基类的默认构造函数的调用. 若想要显示调用,则只能 ...

随机推荐

  1. Hibernate的一对多实例

    一对多在现实生活中很常见,今天做了个Hibernate的一对多的实例,也是个入门过程,写下来跟大家分享. 最重要的是xml配置文件,之前因为把英文"(引号)错误的复制成中文的“”(引号),导 ...

  2. Invoke 和 BeginInvoke 的区别

    在Invoke或者BeginInvoke的使用中无一例外地使用了委托Delegate 一.为什么Control类提供了Invoke和BeginInvoke机制? 关于这个问题的最主要的原因已经是dot ...

  3. Python Django Ajax 传递列表数据

    function getTableContent(node) { event.preventDefault(); var tr = node.parentNode.parentNode; var id ...

  4. Ubuntu16.04安装jupiter

    Ubuntu16.04安装jupiter 1.安装pip pip是一个安装和管理 Python 包的工具, 是 easy_install 的一个替换品.自然对应Python3,则有pip3. Pyth ...

  5. Vue2.x之父子组件数据传递

    父传子,并且通过fatherEvent接收子组件传过来的值 <template> <div class='father'> <Son :fatherData=" ...

  6. 在element-ui的el-tree组件中用render函数生成el-button

    本文主要介绍怎么在el-tree组件中通过render函数来el-button. 这是element-ui中el-tree树: 这是需要实现的效果: tree.vue文件中,具体实现的代码如下: &l ...

  7. Oracle数据库拼接字符串

    Oracle数据库中字符串拼接的实现 select count() from THT_HTFKJL where ht=1: 假如结果为:31.例如上面例子想要给结果拼接字符串有二种实现方法,第一种使用 ...

  8. angular2 如何使用websocket

    1.npm下载: npm install angular2-websocket 2.需要在哪个组件使用就在那里引入: import {$WebSocket} from 'angular2-websoc ...

  9. 黑客之google入侵网站常用方式 2

    一: 在搜索框上输入: “index of/ ” inurl:lib 再按搜索你将进入许多图书馆,并且一定能下载自己喜欢的书籍. 在搜索框上输入: “index of /” cnki 再按搜索你就可以 ...

  10. 使用Babel和ES7创建JavaScript模块

    [编者按]本文主要介绍通过 ES7 与 Babel 建立 JavaScript 模块.文章系国内 ITOM 管理平台 OneAPM 工程师编译呈现,以下为正文. 去年,新版的JavaScript发布了 ...