前言:
C++学习的第二站:类和对象(上)文章的上半部分,知识点:面向过程和面向对象初步认识、类的引入、类的定义、类的访问限定符及封装、类的作用域、类的实例化.
目录
面向过程和面向对象初步认识
类的引入
类的定义
类的访问限定符及封装
访问限定符
封装
类的作用域
类的实例化
面向过程和面向对象初步认识
C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题. C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成.
就拿洗衣服来说:
C语言更注重的是解决问题的过程,洗完一件衣服,需要经历以下过程:
而C++更注重的是在解决问题的过程中的对象个体是什么,对象起的不同作用又是什么,这个对象又是属于什么类,重点关注这些,而不是关注处理事件的过程。
类的引入
C语言 结构体中 只能定义变量 , 在C++中 , 结构体内不仅可以定义变量,也可以定义函数 。
struct Stack
{//成员变量int* a;int top;int capacity;
};
现在以C++方式实现,会发现struct中也可以定义函数:
struct Stack
{//成员函数void Init(){a = nullptr;top = capacity = 0;}void Push(int x){//...}//成员变量int* a;int top;int capacity;
};
C++兼容C语言,结构用法,可以继续使用,同时struct也升级成了类:
1.结构体类不仅可以包含成员变量,也可以包含成员函数
2.这个结构体的名称可以像类一样作为数据类型使用
C语言创建对象,实现传参,C语言不能将数据类型直接写成Stack,需要改名的话用到typedef:
void StackInit(struct Stack* ps)
{//...
}
void StackPush(struct Stack*ps,int x)
{};int main()
{//C语言写法struct Stack st1;//数据类型struct StackStackInit(&st1);StackPush(&st1,1);StackPush(&st1,2);return 0;
}
C++创建对象,访问类中的成员,注意可以直接把结构名Stack当成类名:
struct Stack//(结构名)
{//成员函数void Init(){a = nullptr;top = capacity = 0;}void Push(int x){//...}//成员变量int* a;int top;int capacity;
};int main()
{//C++写法Stack st2;//Stack为类名,可以直接写Stack,不用typedef别名为Stackst2.Init();st2.Push(1);st2.Push(2);st2.Push(3);return 0;
}
C++定义类:①直接用结构体struct ②但更常用的是class
类的定义
class className { // 类体:由成员函数和成员变量组成 }; // 一定要注意后面的分号
class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分 号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者 成员函数。之前我们学过C++的内联函数,内联不能实现声明和定义分离,那么类可以吗?答案是可以。
Func.h#pragma once #include<iostream> using namespace std; class Stack { public://成员函数void Init();void Push(int x);int Top();private://成员变量int* a;int top;int capacity; };
Func.cpp
#include"Func.h" void Stack::Init() {a = nullptr;top = capacity = 0; } void Stack::Push(int x) {if (top == capacity){size_t newcapacity = capacity == 0 ? 4 : capacity * 2;a = (int*)realloc(a, sizeof(int)*newcapacity);capacity = newcapacity;}a[top++] = x; }int Stack::Top() {return a[top - 1]; }
Test.cpp
int main() {Stack st;st.Init();st.Push(1);st.Push(2);st.Push(3);st.Push(4);cout << st.Top() << endl; }
以上代码执行
// 我们看看这个函数,是不是很僵硬?
class Date
{
public:void Init(int year){// 这里的year到底是成员变量,还是函数形参?year = year;}
private:int year;
};
// 所以一般都建议这样
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;
};
那么class与struct的区别是什么呢?引入一个访问限定符的知识。
类的访问限定符及封装
访问限定符
1. public修饰的成员在类外可以直接被访问2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止4. 如果后面没有访问限定符,作用域就到 } 即类结束。5. class的默认访问权限为private,struct为public(因为struct要兼容C)
解答:C++需要兼容C语言,所以C++中struct 可以当成结构体使用 。另外C++中 struct还可以用来 定义类 。 和class定义类是一样的 ,区别是struct定义的类默认访问权限是public,class定义的类默认访问权限是private。注意:在继承和模板参数列表位置,struct和class也有区别,后序给大家介绍。
class Stack
{
public://成员函数void Init(){a = nullptr;top = capacity = 0;//指向栈顶元素的下一个元素}void Push(int x){if (top == capacity) {size_t newcapacity = capacity == 0 ? 4 : capacity * 2;a = (int*)realloc(a, sizeof(int) * newcapacity);capacity = newcapacity;}a[top++] = x;}int Top()//{return a[top - 1];//top-1为栈顶元素}
private://成员变量int* a;int top;int capacity;
};
封装
类的作用域
class Person
{
public:void PrintPersonInfo();
private:char _name[20];char _gender[3];int _age;
};
// 这里需要指定PrintPersonInfo是属于Person这个类域
void Person::PrintPersonInfo()
{cout << _name << " "<< _gender << " " << _age << endl;
}
类的实例化
int main()
{Person._age = 100; // 编译失败:error C2059: 语法错误:“.”return 0;
}
Person类是没有空间的 ,只有Person类实例化出的对象才有具体的年龄。 代码举例:变量定义的特征是开空间
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;d1.Init(2022, 7, 19);d1.Print();d1._year;Date d2;d2.Init(2023,12,12);d2.Print();d2._year;return 0;
}
执行:
类和对象(上)文章的上半部分结束,下半部分待更新。
🔧本文修改次数:0
🧭更新时间:2024年1月19日