1.面向过程和面向对象初步认识
C语言是面向过程的语言,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。
C++是基于面向对象的,关注的是对象,将一件事拆分成不同的对象,靠对象之间的交互完成。
2.类的引入
C语言结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。
其实这个就相当于我们C++中的类,不过我们通常在C++中,用 class 代替。
接下来举一个struct来定义的“类”:
struct S//struct默认public,因为要兼容C
{
int a = 3;
int Add(int a, int b)
{
return a + b;
}
};
int main()
{
S st;
int c = st.Add(1, 2);
cout << c << endl;
return 0;
}
3.类的定义
class classname
{
//类体
};//注意加分号
class是定义类的关键字,classname为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。
类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数。
类的方法两种定义方式:
1.声明和定义全部放入类体,注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。
2.类声明放在类体中(放在类的头文件.h里面),成员定义放在.cpp文件里面
//.cpp
void Stack::Init()
{
_a = nullptr;
_top = 0;
_capacity = 0;
}
//.h
class Stack
{
public://
void Init();
private:
int* _a;
int _top;
int _capacity;
};
4.类的访问限定符及封装
C++实现封装的方式:用类将对象的属性和方法结合在一起,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用。
C++访问限定符:public(公有),protected(保护),private(私有)
说明:
- public修饰的成员在类外可以直接被访问
- protected和private在类外不能直接被访问
- class默认访问权限为private,struct默认为public(因为要兼容C)
5.类的作用域
类定义了一个新的作用域,类的所有成员在类的作用域中,在类外定义成员时,需要::
作用域操作符。
6.类的实例化
用类类型创建对象的过程,称为类的实例化
- 类中的成员(除函数)都只是声明,类就像一个模型,并不会开空间
- 实例化出来的对象才占内存
- 类对象所占字节(空间),不包括成员函数 ,只包括成员变量
- 实例化的类对象的成员函数地址相同,在公共区域内
class A
{
public:
void f()
{
cout<<1<<endl;
}
private:
int _a;
};
int main()
{
A* a1=nullptr;
a1->f();
return 0;
}
所以以上代码不会报错,因为函数不在类对象中,自然不会进入类对象查找,而是直接进入公共区域,但是如果函数需要访问类中的成员变量则会报错;或者此时访问的是_a,则进入类对象查找,空指针的解引用,程序会报错。
计算类的大小:
- 遵循结构体对齐原则
- 只计算成员变量
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;
Date d2;
d1.Init(2024,5,30);
d1.Print();
d2.Init(2024,6,4);
d2.Print();
return 0;
}
Print函数没有参数,且每一个类对象的成员函数地址一致,为什么d1,d2用其却结果不同呢?
这里就要说到类的this指针
this指针特性:
- 类型:类类型*const
- 本质上是成员函数的形参,当对象调用成员函数时,将对象地址作为实参传递给this形参,所以对象中不存储this指针
- 是成员函数第一个隐含的指针形参,一般不需要用户传递
- this一般放在栈里面