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;
}