C++中类的使用

1.类的定义

类似于struct,类也是一种数据类型;类是对象的描述,用数据成员和成员函数来表示对象的样子,所以对象是根据类来创建的。

2. 类外定义的作用域运算符::

声明定义的当前函数属于哪一类

3. 内联函数

关键字inline声明,在类内声明成员函数,在类外定义成员函数,表示此函数在编译过程中不需调用,
即编译器将调用函数放在调用的位置,如此以内存换取时间,适用于小型函数。
在类内直接定义的函数也是内联函数。

4. 数据成员

a.公有数据成员可通过成员运算符获得
b.私有数据成员仅可以通过成员函数和友元函数获得
c.保护数据成员在基类中和私有数据成员一样,但在派生类中可被派生类的成员函数直接访问,其是在派生类的成员函数不能直接访问
基类的私有数据成员的情况下产生的。

5. 构造函数

构造函数名与类名相同,不返回任何数据类型,其一般用于对某些数据成员的初始化。

6. 析构函数

删除所创建的对象。

7. 拷贝构造函数

拷贝构造函数是利用同一类中的另一个对象类初始化当前对象,所以需先有构造函数;
其可分为浅拷贝和深拷贝,浅拷贝是对成员变量的简单赋值;深拷贝是当数据成员中有指针变量时,不能直接进行赋值,
需要进行动态内存分配;

8. 友元函数

关键字friend声明,可访问类内的私有数据成员和保护数据成员,类外定义时,函数名前不需要类作用域运算符,
因为其就不属于类的成员函数。

9. this指针

类对象可通过this指针访问自己的数据成员和成员函数(没有友元函数)。

10. 指向类的指针

类似于结构体一样,需先声明指针变量,然后初始化,最后基于地址指向运算符访问类的成员函数。

11. 类内的静态存储

a.静态变量存在于整个程序的运行声明周期,而不像自动存储变量,在函数结束时就会被释放(动态存储是用new创建,delete删除),
所以当同一类的一个对象被释放后,此静态变量不会被释放,当下一个对象是在基于此静态变量的基础之上进行操作的;
b.public 静态成员变量可使用类作用域运算符直接操作;
c.静态成员函数只能访问静态变量和静态成员函数,其没有this指针。

12. 代码

#include <iostream>
using namespace std;
class Box
{
//私有数据成员
private:
	int length;
	int width;
	int *ptr;
//保护数据成员
protected:
	int height;
public:
	static int count;//静态变量

	//构造函数的不同写法
	//Box() = default;
	//Box(int l, int w, int h) :length(l),width(w),height(h) {cout<<"init list"<<endl;};//基于初始化列表
	Box(int l,int w,int h,int p);

	//浅拷贝构造函数
	//Box(Box &ana_box);
	//深拷贝构造函数
	Box(Box &ana_box);

	//成员函数声明
	int cal_volume();

	void get_data_by_this();

	//静态成员函数
	static void get_satic_data()
	{
		cout << "获得静态变量:" << count << endl;
	}

	//内联函数
	inline int * cal_area();

	//友元函数
	friend void get_data_by_friend(Box box);

	//析构函数
	~Box();
};

//类成员函数的类外定义
Box::Box(int l, int w, int h,int p) //构造函数没有返回类型
{
	length = l;
	width = w;
	height = h;
	ptr = new int;//指针变量需要分配内存
	*ptr = p;
	count++;
};
//浅拷贝构造函数
//Box::Box(Box &ana_box) 
//{
//	length = ana_box.length;
//	width = ana_box.width;
//	height = ana_box.height;
//}
//深拷贝构造函数
Box::Box(Box &ana_box)
{
	length = ana_box.length;
	width = ana_box.width;
	height = ana_box.height;
	ptr = new int;//为动态变量分配新的内存
	*ptr = *ana_box.ptr;
}
//析构函数
Box::~Box()
{
	cout << "删除对象!" << endl;
	delete ptr;//需删除在动态内存创建的动态变量
}
//成员函数
int Box::cal_volume()
{
	//成员函数可直接访问私有数据成员
	int volume = length*width*height*(*ptr);
	cout << "获得动态变量:"<< *ptr << endl;
	return volume;
}
int * Box::cal_area() 
{
	int area1 = width*height;
	int area2 = width*length;
	int area3 = height*length;
	int arr[3] = { area1, area2, area3 };
	return arr;
}
//友元函数
void get_data_by_friend(Box box)
{
	cout << "友元函数访问私有数据成员和保护数据成员:" <<
		box.width<<'\0' << box.height << '\0' << box.length << '\0' << endl;
}
//this指针
void Box::get_data_by_this()
{
	cout << "this 指针获得数据成员:" << this->height << endl;
	cout << "this指针获得成员函数:" << this->cal_volume() << endl;
}
//赋值public 静态变量
int Box::count = 0;

void main()
{
	//类对象的声明
	Box box(1, 2, 3, 4);
	//访问类的成员函数
	cout << "箱子的体积:"<< box.cal_volume() << endl;
	cout << "箱子的各个面积:" << *(box.cal_area()+1) << endl;

	get_data_by_friend(box);
	cout << endl;

	box.get_data_by_this();

	//定义类的指针变量
	Box *ptr;
	ptr = &box; //指针初始化
	cout << "通过指针访问类成员函数: " << ptr->cal_volume() << endl;

	//获得静态存储区域的变量
	box.get_satic_data();
	Box box1(1, 2, 3, 4);
	box1.get_satic_data();

	//拷贝构造函数初始化的两种初始化方式
	//Box new_box(box);
	Box new_box = box;
	cout << "箱子的体积:" << new_box.cal_volume() << endl;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值