c++中类对象的构造和析构

文章目录

    • 前言
    • 一、构造和析构函数
    • 二、构造函数的分类及调用
    • 三、构造函数调用规则研究

前言

创建一个对象时,常常需要作某些初始化的工作,例如对数据成员赋初值。注意,类的数据成员是不能在声明类时初始化的。

为了解决这个问题,C++编译器提供了构造函数(constructor)来处理对象的初始化。构造函数是一种特殊的成员函数,与其他成员函数不同,不需要用户来调用它,而是在建立对象时自动执行。

一、构造和析构函数

构造函数
1、构造函数定义及调用
(1)C++中的类可以定义与类名相同的特殊成员函数,这种与类名相同的成员函数叫做构造函数;
(2)构造函数在定义时可以有参数;
(3)没有任何返回类型的声明。

2、构造函数的调用
自动调用:一般情况下C++编译器会自动调用构造函数
手动调用:在一些情况下则需要手工调用构造函数

析构函数
1、析构函数定义及调用
(1)C++中的类可以定义一个特殊的成员函数清理对象,这个特殊的成员函数叫做析
语法:~ClassName()
(2)析构函数没有参数也没有任何返回类型的声明
(3)析构函数在对象销毁时自动被调用

2、析构函数调用机制
C++编译器自动调用


#define  _CRT_SECURE_NO_WARNINGS 
#include 
using namespace std;

class Test{
   
public:
//无参数 构造函数
	Test(){
     
		a = 10;  //作用完成对属性的初始化工作
		p = (char *)malloc(100);
		strcpy(p, "aaaaffff");
		cout<<"我是构造函数 被执行了"<<endl;
	}
	void print(){
   
		cout<<p<<endl;
		cout<<a<<endl;
	}
	//析构函数
	~Test() {
   
		if (p != NULL){
   
			free(p);
		}
		cout<<"我是析构函数,被调用了" <<endl;
	}
protected:
private:
	int a ;
	char *p;
};

//给对象搭建一个舞台,研究对象的行为
void objplay(){
   
	//先创建的对象 后释放
	Test t1;
	t1.print();
	printf("分隔符\n");
	Test t2;
	t2.print();
}
void main(){
   
	objplay();
	cout<<"hello..."<<endl;
	system("pause");
	return ;
}

C++编译器构造析构方案 VS 对象显示初始化方案

1、为什么需要设置构造函数和析构函数?

面向对象的思想是从生活中来,手机、车出厂时,是一样的。生活中存在的对象都是被初始化后才上市的;初始状态是对象普遍存在的一个状态的。
2、是如何设置初始化的?普通方案:

  1. 为每个类都提供一个public的initialize函数;
  2. 对象创建后立即调用initialize函数进行初始化

3、优缺点分析

  1. initialize只是一个普通的函数,必须显示的调用
  2. 一旦由于失误的原因,对象没有初始化,那么结果将是不确定的,没有初始化的对象,其内部成员变量的值是不定的
  3. 不能完全解决问题
//为什么对象需要初始化 有什么样的初始化方案
#include "iostream"
using namespace std;
class Test21{
   
public:
	int m;
	int getM() const {
   
	return m;

你可能感兴趣的:(C++,c++)