C++封装之美:类与this指针解析
代码语言:javascriptAI代码解释。
类的本质是封装 ,相比c语言,c语言的数据和方法都是分离的,c++把数据和方法都放到了类里面
类的定义格式:
代码语言:javascript
AI代码解释
class Stack//定义一个栈
{
private:
void Init(int capacity=4)
{
_array=(int*)malloc(sizeof(int)*capacity);
assert(_array);
_capacity=capacity;
_top=0;
}
public:
int*_array;
size_t _capacity;
size_t _top;
}
class为定义类的关键字,Stack为类的名字,{}中为类的主体
类中的内容:类的成员
类中变量:成员变量,一般为了却分成员变量,会在变量名前加一个特殊标识符
类中可以定义函数,称为成员函数
定义在类里面的成员函数默认为内敛函数
内联函数:
内联函数的概念
内联函数(Inline Function)是C++中一种优化函数调用的机制,通过将函数体直接插入调用处来避免函数调用的开销(如压栈、跳转、返回等)。适用于短小且频繁调用的函数。
内联函数的定义
在函数声明或定义前添加 inline 关键字即可将其标记为内联函数:
代码语言:javascript
AI代码解释
inline int add(int a, int b) {
return a + b;
}
编译器会根据实际情况决定是否真正内联(如递归函数、复杂函数可能被忽略)。
内联函数的优势
- 减少开销:消除函数调用时的额外指令(如参数传递、栈帧操作)。
- 提升性能:适合高频调用的简单函数(如短循环内的操作)。
内联函数的限制
- 体积膨胀:代码被多次复制可能导致可执行文件变大。
- 编译器自主性:
inline仅是建议,编译器可能拒绝复杂函数的内联请求。 - 调试困难:内联后的代码难以设置断点。
内联函数与宏的区别
- 类型安全:内联函数遵循C++类型检查,宏仅是文本替换。
- 调试支持:内联函数可调试,宏在预处理阶段已展开。
- 副作用:宏可能因多次参数求值导致意外行为(如
#define SQUARE(x) x*x调用SQUARE(++x)会出错)。
内联函数的使用场景
- 短小函数:如简单的数学运算、getter/setter。
- 高频调用:循环内的轻量级操作。
- 替代宏:需要类型安全且避免副作用的场景。
示例代码
代码语言:javascript
AI代码解释
#include <iostream>
using namespace std;
inline int max(int x, int y) {
return (x > y) ? x : y;
}
int main() {
cout << max(10, 20); // 可能被替换为 cout << (10 > 20 ? 10 : 20);
return 0;
}
注意事项
- 避免内联复杂函数(如含循环、递归)。
- 头文件中定义内联函数时需确保函数体可见(通常在头文件中实现)。
- 现代编译器(如GCC、Clang)能自动内联简单函数,无需显式指定
inline。
类与struct的区别:
- 类中内容称为类的成员,类中的变量称为类的成员变量或者类的属性
- 类中可以定义函数,类中的函数称为类的方法或者类的成员函数
- 用栈来举例,结构体中放的只是我们需要的数据,方法是单独写的,但是在类中我们把这些都放在了class的主体中了
- 类可以直接使用类名,不需要使用typedef来重命名。(类名就是类型)
类的访问权限:
public,后面的内容为共有
private\ protected,后面内容为私有
代码语言:javascript
AI代码解释
class Stack
{
piblic:
void Init(int n=4)//给栈初始化
{
....
}
void push(int x)//入栈
{
...
}
private:
int *array;
size_t capacity;
size_t top;
}
一般成员函数是公有的,成员变量是私有的。
访问权限的范围,比如上面public,从“:”开始,一直到private ,也就是从自身到下一个访问限定符,如果只有一个访问限定符,那么就是直接到“}”结束。
在class中,如果没给出访问限定符,那么默认是私有
在类中,不管是私有还是公有,都是能访问的
在c++中,struct也可用来定义类,当struct中没有给出访问限定符时,默认是公有
c++struct的用法兼容c
访问限定符
- C++⼀种实现封装的方式,用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用。
- public修饰的成员在类外可以直接被访问;protected和private修饰的成员在类外不能直接被访问,protected和private是⼀样的,以后继承章节才能体现出他们的区别。
- 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止,如果后面没有访问限定符,作用域就到即类结束。
- class定义成员没有被访问限定符修饰时默认为private,struct默认为public。
- ⼀般成员变量都会被限制为private/protected,需要给别⼈使用的成员函数会放为public。

类域:
域的作用是影响编译器的查找,做到名字的隔离
会影响到编译器的查找,如果不指定类域,编译器在编译时将不会访问类域
类的实例化:
类是没有被分配空间的,只有类实例化出的对象才会被分配空间
类就像一个房子的设计图,告诉了我们房子的样式,但不能住人,换类来说就是不能存数据,只有类实例化出的对象才能存数据
一个类可以实例化多个对象
代码语言:javascript
AI代码解释
class Data
{
private://这是声明
int _year;
int _month;
int _day;
};
int main()
{
//这是类定义一个对象,也叫类实例化出对象
Data d1;
Data d2;
}
//类与对象的关系:1对多,一个类可以实例化出多个对象。
对象大小类实例化出的对象也是有大小的。类实例化出的对象只会在对象中存储类中的成员变量,不会存储成员函数。因为存储成员函数是没必要的,我们每次调用的成员函数都是同一个,他们唯一的区别就是在调用函数时传入的数据不同。如果我们非要在对象中存储成员函数,那么存储的是成员函数的指针,我们每实例化一个对象,就得存储一次指针,存储100个,就得存储100个指针,但是这些个空间是完全没必要的,是一种空间的浪费。
更多推荐

所有评论(0)