构造函数和析构函数以及初始化参数列表、匿名对象

构造函数

是一种特殊的函数,函数名与类名相同,没有返回值;是C++引入的一个机制,专门用于初始化。

C++保证每个对象被创建时都会调用构造函数。

分为以下几种(默认构造和有参构造)

默认构造

如果没有显式的定义任何构造函数,系统会默认的生成一个无参构造函数(什么都不做)。

当我们声明了任何一个构造函数后,系统不会生成默认构造函数。

例如,(系统默认生成的无参构造函数)

    1 	class A {
    2 	public:
    3 	        A() {
    4 	
    5 	        }
    6 	};

main函数中:

A a;//A a();这个就相当于声明函数了

有参构造

例如,(自己构造的有参构造函数)

    1 	class A {
    2 	public:
    3 	        A(int,int) {
    4 	
    5 	        }
    6 	};

main函数中:

A a(int,int);//括号里是两个int类型参数

析构函数

当对象释放时才会调用的函数,用来处理对象管理的内存。

例如,

    1 	#include <string>
    2 	#include<iostream>
    3 	using namespace std;
    4 	class A {
    5 	public:
    6 	        char* str;
    7 	        A() {
    8 	                str = (char*)malloc(20);//C++中malloc使用必须强制转换
    9 	        }
   10 	        ~A() {//析构函数
   11 	                free(str);
   12 	        }
   13 	};
   14 	int main() {
   15 	
   16 	}

初始化参数列表

构造函数里可以有初始化参数列表,初始化参数列表负责指定所有成员的初始化参数。

构造函数中初始化可以在“:”后边,也可以在构造函数里边。

(初始化参数列表只能在构造函数中写。)

例如,

    1 	class A {
    2 	        int a;
    3 	        int b;
    4 	public:
    5 	        A() :a(5),b(3){
    6 	
    7 	        }
    8 	};

还有其他形式的初始化参数列表,就不写代码了。

传参时的初始化列表更有趣,哈哈

匿名对象

    1 	#include <string>
    2 	#include<iostream>
    3 	using namespace std;
    4 	class A {
    5 	public:
    6 	        string toString() {
    7 	                return NULL;
    8 	        }
    9 	};
   10 	int main() {
   11 	        A();//创建了一个匿名对象,该行代码结束就析构
   12 	        cout << A().toString() << endl;//创建一个匿名对象,调用类中方法,该行代码结束就调用析构
   13 	        return 0;
   14 	}

如果要保存匿名对象,可以创建一个对象保存:

 A b = A(); 

匿名对象传参也可以:

A(int,int);

下面是我自己练习的一个代码程序:

    1 	#include<iostream>
    2 	#include<string>
    3 	using namespace std;
    4 	class B {
    5 	public:
    6 		B() {
    7 			cout << "调用了B无参构造函数" << this << endl;
    8 		}
    9 		B(int, int) {
   10 			cout << "调用了B有参构造函数" << this << endl;
   11 		}
   12 	};
   13 	class A {
   14 		B ob;//no.1
   15 		B obj;//no.2                   
   16 		int a;
   17 		int b;
   18 		int c;
   19 		char* str;
   20 	public:
   21 		A() :a(1),b(2),c(3),obj(66,77),ob(){//初始化参数那块的顺序与开始创建对象(例如:no.1和no.2)的顺序有关
   22 			cout << "当前行数" << __LINE__ <<"调用了无参构造函数" << "当前地址" << this << endl;
   23 			a = 20;
   24 			b = 10;
   25 			c = 70;
   26 			str = (char*)malloc(10);
   27 		}
   28 		string Tostring() {
   29 			return("[" + to_string(a) + "," + to_string(b) + "," + to_string(c) + "]" );
   30 		}
   31 		A(int a,int b) {
   32 			cout << "当前行数" << __LINE__ << "调用了有参构造函数" << "当前地址" << this << endl;
   33 			this->a = a;
   34 			this->b = b;
   35 			c = 90;
   36 			str = (char*)malloc(10);
   37 		}
   38 		~A() {
   39 			free(str);
   40 			cout << "当前行数" << __LINE__ <<"析构当前构造函数"<<"当前地址"<< this << endl;
   41 		}
   42 	};
   43 	int main() {
   44 		A a;
   45 		cout << "当前行数" << __LINE__ << endl;
   46 		cout << a.Tostring() << endl;
   47 		A b(3,3);
   48 		cout << "当前行数" << __LINE__ << endl;
   49 		cout << b.Tostring() << endl;
   50 		A();//构造一个匿名函数,该行代码结束就销毁
   51 		cout << A().Tostring() << endl;
   52 		A(5, 5);
		cout << A(5,5).Tostring() << endl;
	}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

追梦偏执狂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值