以下是关于c++中的类的相关内容的一点总结,都是基础的东西,这里写下来,方便以后查看。说明都在代码的注释中,下面就上代码吧。

//类的头文件
#ifndef _MY_CLASS_H_
#define _MY_CLASSS_H_

#include <iostream>

using namespace std;
//类包含成员变量和成员函数,如果这些成员没有加限定符的时候默认使用的是private,我们一般将成员变量限定为
//private,这就是数据隐藏,而将成员函数限定为public,这个就是和外部通信的接口,访问这些私有的成员变量的
//时候如果是在成员函数中可以直接访问,若是外部想要访问的话就只能通过成员函数了
class MyClass
{
public:
	MyClass(int age=10,char * name="zaojiahua");
	~MyClass();
	//这个是const函数的声明,我们在调用一个对象的成员函数的时候默认是传入一个this的指针的,这个指针指向的就
	//是自己,当我们不希望改变调用对象的时候(也就是说不修改这个对象的成员变量),我们就在函数的后边加上const
	//在函数的实现处也应该加上这个const,这是因为this这个指针不是在函数的形参列表中传递的,而是通过隐式的方法
	//传递的,所以我们没法在函数的参数列表中使用const限定符
	void show()const;
private:
	int m_age;
	char * m_name;
};

#endif
#include "MyClass.h"

MyClass::MyClass(int age,char * name)
{
	m_age = age;
	m_name = name;
}
//这里有一个重要的问题就是析构函数的调用时期,概括的说我们创建了一个对象,当这个对象不再使用的时候就会
//调用析构函数,那么什么是不再使用的时候呢?如果对象是在代码块中创建的,并且不是通过new创建的,则在
//代码块结束的时候会调用该对象的析构函数,如果这个对象是new出来的,则只有我们去delete的时候才会调用它
//的析构函数,如果这个对象是static全局的变量则当我们程序结束的时候才会调用这个对象的析构函数。如果系统
//创建了一个临时的对象来完成一些操作,记住是系统创建出来的,不是我们创建的,则当系统不再使用这个临时的
//对象的时候会调用它的析构函数,那么系统什么时候会创建临时的对象呢,比如当我们这么声明对象的时候
//MyClass m = MyClass()这个时候系统可能用MyClass()创建一个临时的对象,然后调用复制构造函数给m赋值
//当系统使用完这个临时的对象以后就在一段时间内删除它
//析构函数的应用场景是当我们在构造函数中使用了new来初始化我们的成员变量的时候,在析构函数中就应该使用
//delete来删除成员变量
MyClass::~MyClass()
{

}

void MyClass::show()const
{
	cout<<"show"<<endl;
	//以下这句话会报错
	//this->m_age = 21;
}
#include "MyClass.h"

int main()
{
	//隐式的调用构造函数
	MyClass m1(20,"zaojiahua");
	//显式的调用构造函数,俩种方法都是在栈上分配内存空间,m1和m2有不同的数据成员,也就是说每人有一份
	//age和name,但是成员方法是共享的
	MyClass m2 = MyClass(21,"xiaota");

	//在堆上分配内存空间,m3指向这块内存空间
	MyClass * m3 = new MyClass(23,"hello");

	//m4将调用类的默认构造函数,默认构造函数指的就是没有任何参数的构造函数,当我们自己没有定义任何的
	//构造函数的时候系统会为我们生成一个默认的构造函数,这个默认的构造函数什么都不做,当我们定义了构造
	//函数的时候就没有了这个默认的构造函数,如果这个时候像下面这样的使用来创建对象就会出错,这个时候我们
	//就要来定义默认的构造函数了,定义的方法有俩种,一种是在已定义的构造函数的参数处加上默认值,比如
	//MyClass(int age=10,char * name="zaojiahua")(加在函数的声明处),一种是采用函数重载的方式再定义一个构造函数
	//隐式调用默认构造函数的时候不要加圆括号,MyClass m4();,这样的就成了函数声明了
	MyClass m4;
	//显式的调用默认的构造函数加上圆括号
	MyClass m5 = MyClass();

	//隐式调用默认的构造函数
	MyClass * m7 = new MyClass;
	//显示的调用
	MyClass * m8 = new MyClass();

	//如下的这种使用方法是先创建了一个m6对象,调用的是它的默认构造函数,然后又通过赋值的形式为m6赋值的
	//当为m6赋值的时候,是先创建了一个临时的对象,然后将这个临时的对象中的成员变量的值赋给了m6,最后删除这个
	//临时的对象
	MyClass m6;
	m6 = MyClass(24,"xiaota");

	m6.show();
	return 0;
}