面向过程和面向对象初步认识:
- C语言是面向过程的,关注的是过程,分析出问题求解的步骤,用函数调用逐步解决。
- C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。
一、类
e.g.
#include <iostream> using namespace std; // 在C++中,struct 升级成了类(C++兼容C语言struct的所有语法) // 1. Stack 就是类型名,不用加struct // 2. 类里面可以定义函数 struct Stack { int* _a; int _top; int _capacity; void Init() { _a = nullptr; _top = _capacity = 0; } }; int main() { Stack s1; s1.Init(); return 0; }
1.1 类的定义
在C++中,更喜欢用关键字 class定义类。
class Name
{
// 类体:由成员函数和成员变量组成
};
类定义的两种方式:
-
声明和定义全部放在类体中。
PS: 成员函数如果在类中定义,编译器会把其当作内联函数(是否展开取决于编译器)。
- 类声明放在
.h
文件中,成员函数定义放在.cpp
文件中。
Sup:
类的作用域:
类定义了一个新的作用域,类的所有成员都在作用域内。在类外定义成员时,需要使用
::
作用域限定符指明成员属于哪个类作用域。
// Stack.h
struct Stack
{
// ...
void Init();
};
// Stack.cpp
// 指定Init属于Stack类域
void Stack::Init()
{
// ...
}
1.2 访问限定符
在C++中利用类,通过访问权限选择性的将其接口提供给外部用户使用。
访问限定符:public
、protected
、private
。
PS:
public
修饰的成员在类外可以直接被访问;protected
和private
修饰的成员在类外不能被直接访问。- 访问权限作用域从该访问限定符出现的位置开始,到下一个访问限定符出现结束;如果后面没有访问限定符,则作用域到
}
结束(即类结束)。 - class 的默认访问权限为
private
,struct 的默认访问权限为public
(C++要兼容C语言)。
1.3 类的实例化
用类类型创建对象的过程,称为类的实例化。
- 类是对对象进行描述的,定义出一个类并没有分配出实际的内存空间来储存它。
class Stack
{
private:
// 类成员变量声明,并不开辟实际内存空间
int* _a;
int _top;
int _capacity;
};
- 一个类可以实例化多个对象,实例化出的对象占用实际物理空间,储存类成员变量。
int main()
{
Stack s1;
cout << sizeof(s1) << endl;
return 0;
}
二、对象
类对象的储存方式:只保存成员变量,成员函数放在公共的代码段。
一个类的大小,实际就是该类中“成员变量之和”(要考虑内存对齐);注意空类大小,编译器给空类一个字节来唯一标识这个类的对象。
#include <iostream> using namespace std; class A1 // 空类 {}; class A2 // 只有成员函数 { public: void f(); }; class A3 // 既有成员变量又有成员函数 { private: int* _a; public: void Init(); }; int main() { cout << sizeof(A1) << endl; // 1 cout << sizeof(A2) << endl; // 1 cout << sizeof(A3) << endl; // 4 return 0; }
三、this 指针
class Date { private: int _year; int _month; int _day; public: void Init(int year = 10, int month = 10, int day = 10) { _year = year; _month = month; _day = day; } void Print() { cout << _year << " " << _month << " " << _day << endl; } }; int main() { Date d1; Date d2; d1.Init(); d2.Init(2023, 10 ,26); d1.Print(); d2.Print(); return 0; }
C++为每个“非静态成员函数”增加了一个隐含的指针参数——this
指针,让this
指针指向该当前对象,在函数体中所有关于“成员变量”的操作都是通过this
指针去访问(编译器自动完成)。
this
指针相关的实参和形参不能显示写出。