目录
1.类的关键字与定义:
class person
{
private:
int age;
char sex;
public:
void print()
{
cout << "hello C++" << endl;
}
};
关键字:class与struct(class居多)
class定义成员没有被访问限定符修饰时默认为private,struct默认为public。
定义:类里可以有变量也可以有相应的方法(函数)。
注意:类的定义是不占用空间的,类里面定义的函数为内联函数。
2.内联函数inline
inline void print1()
{
cout << 1 << endl;
}
内联函数可以理解为是将函数所在的那部分代码在出现函数调用的部分进行了展开(类似宏定义),不再调用函数栈帧,提高了程序的效率。
但展开又并非所有的情况都能展开,展开与否取决于编译器,一般是规模小且调用次数多的函数可以展开。
在类中定义的成员函数默认为内联函数。
3.访问限定符
1.public
2.private
3.protected
class person
{
private:
int age;
char sex;
public:
void print()
{
cout << "hello C++" << endl;
}
};
public修饰的成员在类外可以直接被访问;protected和private修饰的成员在类外不能直接被访问,protected和private是⼀样的,以后继承章节才能体现出他们的区别。
⼀般成员变量都会被限制为private/protected,需要给别⼈使⽤的成员函数会放为public。
4.类域
class Stack
{
public:
// 成员函数
void Init(int n = 4);
private:
// 成员变量
int* array;
size_t capacity;
size_t top;
};
// 声明和定义分离,需要指定类域
void Stack::Init(int n)
{
array = (int*)malloc(sizeof(int) * n);
if (nullptr == array)
{
perror("malloc申请空间失败");
return;
}
capacity = n;
top = 0;
}
5.对象
对象也就是根据类来构造的实例化对象,可以理解为类是模型,对象才是实物。
class Date
{
public:
void Init(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
void Print()
{
cout << _year << "/" << _month << "/" << _day << endl;
}
private:
// 这⾥只是声明,没有开空间
int _year;
int _month;
int _day;
};
int main()
{
// Date类实例化出对象d1和d2
Date d1;
Date d2;
d1.Init(2024, 3, 31);
d1.Print();
d2.Init(2024, 7, 5);
d2.Print();
return 0;
}
结果:
6.对象的大小
对象的大小只用看类里定义的变量即可(按照结构体内存对齐的方法来看),函数是不用管的,因为它是存储在代码块的,每个对象都可以调用那些方法,而不是以对象中存函数指针的形式进行存储。
7.this指针
class Date
{
public:
void Init(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
void Print()
{
cout << _year << "/" << _month << "/" << _day << endl;
}
private:
// 这⾥只是声明,没有开空间
int _year;
int _month;
int _day;
};
int main()
{
// Date类实例化出对象d1和d2
Date d1;
Date d2;
d1.Init(2024, 3, 31);
d1.Print();
d2.Init(2024, 7, 5);
d2.Print();
return 0;
}
Date类中有Init与Print两个成员函数,函数体中没有关于不同对象的区分,那当d1调用Init和 Print函数时,该函数是如何知道应该访问的是d1对象还是d2对象呢?那么这⾥就要看到C++给了⼀个隐含的this指针解决这里的问题。
d1.Init(&d1,2024, 3, 31);
当你的d1对象调用Init这个方法以后,实际上还会传过去d1本身的地址。
而函数会用this指针接收你传过来的对象地址,这个this指针便是成员函数隐藏的第一个形参,而成员函数里面提及的方法都是以例如this->_year=year来执行的。
8.总结:
类与对象的本质还是封装的思想,实现面向对象编程,而不是像C语言那样手搓面向过程编程,提高了代码的可控能力。