c++类和类的封装

1.类和类成员

C++提供了如char、int、long、float、double等基本数据类型,足够用来解决大多数哦相对简单的问题,但对于复杂的问题就比较困难了。

C++的一个实用特性是自定义数据类型;如之前的枚举和结构体:

 struct Goods
{
	char* mname;
	float mprice;
	int mamount;
}

struct 类中默认访问限定符是公有的,OOP类中默认访问限定符是私有的;

类的封装:访问限定符

public:任意位置都可以进行访问

protect:子类、本类类中允许访问

private:本类类中访问

class CGoods
{
public:
	void Sell()
	{
		--mamount;
	}
	void Buy()
	{
		++mamount;
	}
private:
	char* mname;
	float mprice;
	int mamount;
};

对象的生成:

(1)对象开辟内存空间;

(2)对象内存做初始化,调用构造函数

对象的销毁:

(1)释放对象所占的其他资源,调用析构函数;

(2)释放对象所占的内存空间;

二、c++中的六个默认函数(若程序不定义或不调用,编译器自动定义或调用的函数)

(1)构造函数:

          类的一种特殊的成员函数,当类被实例化时执行;通常用以初始化。

          构造函数有明确的命名规则:A)函数名必须和类名一样;B)无返回类型(包括void)。

         无参构造函数-不带参数的构造函数,是类的默认构造函数

class Test
{
public:
	Test(int a, int b)
	{
		std::cout << this << "Test:: Test(int,int)" << std::endl;
		ma = a;
		mb = b;
	}
	Test(int a)
	{
		std::cout << this << "Test:: Test(int)" << std::endl;
		ma = a;
	}
	Test()
	{
		std::cout << this << "Test:: Test()" << std::endl; //默认构造函数
	}
	Test(const Test& rhs)
	{
		std::cout << this << "Test:: Test(const Test&)" << std::endl;
		ma = rhs.ma;
		mb = rhs.mb;
	}

(2)析构函数:

        析构函数(destructor) 与 构造函数相反,当对象结束其 生命周期时(例如对象所在的函数已调用完毕),系统             自动          执行析构函数。当程序中没有析构函数时,系统会自动生成析构函数。

         特点:不可重载、可以手动进行调用,先构造,后析构。

         作用:释放对象资源。

~Test()
	{
		std::cout << this << "Test::~Test()" << std::endl;
	}

(3)拷贝构造函数:

          由编译器调用来完成一些基于同一类的其他对象的构建及初始化(默认为浅拷贝)

         拷贝构造函数调用的三种形式
       (1)一个对象作为函数参数,以值传递的方式传入函数体;
       (2)一个对象作为函数返回值,以值传递的方式从函数返回;
       (3)一个对象用于给另外一个对象进行初始化(常称为复制初始化)。

class Test
{
public:
	Test(int a, int b)
	{
		std::cout << this << "Test:: Test(int,int)" << std::endl;
		ma = a;
		mb = b;
	}
	Test(int a)
	{
		std::cout << this << "Test:: Test(int)" << std::endl;
		ma = a;
	}
	Test()
	{
		std::cout << this << "Test:: Test()" << std::endl;
	}
	Test(const Test& rhs)
	{
		std::cout << this << "Test:: Test(const Test&)" << std::endl;
		ma = rhs.ma;
		mb = rhs.mb;
	}
	Test& operator=(const Test& rhs)
	{
		std::cout << this << "Test::operator = (const Test&)" << std::endl;
		if (this != &rhs)
		{
			ma = rhs.ma;
			mb = rhs.mb;
		}
		return *this;     //拷贝构造函数
	}
	~Test()
	{
		std::cout << this << "Test::~Test()" << std::endl;
	}

(4)赋值运算符的重载函数:

        1.判断自赋值;

        2.释放旧资源;

        3.开辟新资源;

        4.赋值;     

       形参中const的作用:1.防止实参被修改;2.接收隐式生成的临时量;

CGoods(const CGoods& rhs)
	{
		std::cout << this << " CGoods::CGoods(const CGoods&)" << std::endl;
		mname = new char[strlen(rhs.mname) + 1]();
		strcpy(mname, rhs.mname);
		mprice = rhs.mprice;
		mamount = rhs.mamount;
	}    //普通构造函数
	
	CGoods& operator=(const CGoods& rhs)  //赋值运算符重载函数
	{
		std::cout << this << " CGoods::operator=(const CGoods&)" << std::endl;
		if (this != &rhs)     //判断自赋值
		{
			delete[] mname;    //释放旧资源
			mname = new char[strlen(rhs.mname) + 1]();  //申请开辟新资源

			strcpy(mname, rhs.mname);
			mprice = rhs.mprice;
			mamount = rhs.mamount;        //赋值
		}
		return *this;
	}
	~CGoods()       //调用析构函数
	{
		std::cout << this << " CGoods::~CGoods()" << std::endl;
		delete[] mname;
		mname = NULL;
	}

后面还有

5.取地址操作符的重载函数

6.const修饰的取地址操作符的重载函数

这两个在c++中应用不太常见,因此在这里不做描述;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值