☰
【C++】 类与对象(一)(class 类的定义)
2026/9/28 3:40:43 网站建设 项目流程

目录

class 类的定义

类定义格式

类的访问限定符

类域

实例化

实例化概念

对象大小

this 指针

C语言和C++代码实现stack 栈的区别


class 类的定义

类定义格式

  • class 为定义类的关键字,像Stack 为类的名字,{}中的所有的内容就是类的主体,注意类定义结束时不能省略“;”,类的中的所有内容都成为类的成员,变量就是成员变量,函数就是成员函数。
  • 为了区分成员变量和传参变量一般会给成员变量的前加一个“_”下标注符进行区分,或者加 m 进行区分,建议第一种,当然还是看个人习惯。
  • C++ 中struct 也可以定义类,C++兼容C语言的struct 的用法,struct 升级class ,class 会高级更多,所以C++ 更多会使用class 来代替struct 。
  • 定义在类的成员成员函数默认为inline 。
#include <iostream> class Stack { private: int _year; int _mount; int _day; };

类的访问限定符

  • C++有一种实现封装的操作,用类将对象的属性的与方法结合在一块,对对象的功能上有更加完善,通过部分开通权限让用户有选择性的使用。
  • C++的类中共有三种访问限定符,public(公有)private(私有)protected(私有),public 可以class 类域外直接访问,private 就不行,protected 暂时记忆成两个都是相同的。
  • 区域的分是从该访问限定符到下一个访问限定符(或者到 } ) 的区域都是第一个访问限定符的对应的指定功能,默认(class)类的访问限定符时private ,struct 默认 public 。

类域

全局域,临时域,类定义了一个新的作用域,类所有的成员都在类的作用域中,在类的外要定义成员的时候就是需要“ :: ”作用域操作符来指明哪个类域的成员和成员函数。

声明定义分离问题(cpp 源代码文件与 h头文件)

//test.h #include <iostream> #include <stdlib.h> using namespace std; class Stack { public: void Init(int n=4); private: int* _array; size_t _capacity; size_t _top; }; //test.cpp #include "test.h" void Stack::Inti(int n) { _array=(int*)malloc(sizeof(int)*n); if(_array==NULL) { perror("malloc"); exit(1); } _capacity=n; _top=0; } int main() { Stack S; S.Init(); return 0; }

实例化

实例化概念

简单概括就是通过创建出来的类,用int 等等的类型那样来声明变量的方式使用类上,这种方式叫做实例化对象。

类是对象进行一种抽象的描述,类是不占运行空间,只对实例化对象分配空间。

一个类可以实例化很多对象,实话对象跟多占的空间就越多。

对象大小

类实例化对象所占的大小,只跟类中的成员变量有关,与成员函数无关,如果每个类的函数还包含在内的化,那么这个类的所占的空间只会非常大,所以这些函数只会分配到其他空间上对应的类调用的时候才会有被进行调用;计算的方式与结构体 struct 一样,也需要符合内存对齐原则。

this 指针

this 就是在当前实例化对象的地址,换言之 *this 就是实力化对象。

#include <iostream> #include <stdlib.h> using namespace std; class Stack { public: void Init(int n=4); private: int* _array; size_t _capacity; size_t _top; };

以上面代码为例,this->_array[0],this->_capacity,this->_top 等等都是可以充分使用到实例化对象的每一个成员变量,但是在类域中无需这么去写,无需写入this ,正常使用变量名我们还是可以用到对应的变量的,this 的最大用处之一是来充当return的返回值,注意是之一,this 的用处还不止这么有关,只要知道this 是实例化对象的地址,*this 的实例化对象即可。

补充:this 指针存在在栈区上

题目练习:

#include<iostream> using namespace std; class A { public: void Print() { cout << "A::Print()" << endl; } private: int _a; }; int main() { A* p = nullptr; p->Print(); return 0; }
1.下⾯程序编译运⾏结果是()
A、编译报错 B、运⾏崩溃 C、正常运⾏
#include<iostream> using namespace std; class A { public: void Print() { cout << "A::Print()" << endl; cout << _a << endl; } private: int _a; }; int main() { A* p = nullptr; p->Print(); return 0; }
2.下⾯程序编译运⾏结果是()
A、编译报错 B、运⾏崩溃 C、正常运⾏

C语言和C++代码实现stack 栈的区别

C语言实现的Stack 栈的代码

#include <stdio.h> #include <stdlib.h> #define MAXSIZE 100 // 栈最大容量 // 栈结构体 typedef struct { int data[MAXSIZE]; int top; // 栈顶下标,-1代表空栈 } Stack; // 初始化栈 void InitStack(Stack *s) { s->top = -1; } // 判断栈空 int IsEmpty(Stack *s) { return s->top == -1; } // 判断栈满 int IsFull(Stack *s) { return s->top == MAXSIZE - 1; } // 入栈 push int Push(Stack *s, int val) { if (IsFull(s)) { printf("栈已满,无法入栈\n"); return 0; } s->data[++s->top] = val; return 1; } // 出栈 pop int Pop(Stack *s, int *res) { if (IsEmpty(s)) { printf("栈为空,无法出栈\n"); return 0; } *res = s->data[s->top--]; return 1; } // 获取栈顶元素 int GetTop(Stack *s, int *res) { if (IsEmpty(s)) { printf("栈为空\n"); return 0; } *res = s->data[s->top]; return 1; } // 遍历打印栈 void PrintStack(Stack *s) { if (IsEmpty(s)) { printf("栈空\n"); return; } printf("栈内元素(栈底→栈顶):"); for (int i = 0; i <= s->top; i++) { printf("%d ", s->data[i]); } printf("\n"); } int main() { Stack st; InitStack(&st); int temp; Push(&st, 10); Push(&st, 20); Push(&st, 30); PrintStack(&st); GetTop(&st, &temp); printf("栈顶:%d\n", temp); Pop(&st, &temp); printf("出栈元素:%d\n", temp); PrintStack(&st); return 0; }

C++ 实现的Stack栈的代码

#include <iostream> using namespace std; const int MAX = 50; // 栈类封装 class MyStack { private: int arr[MAX]; int topIndex; // 栈顶下标,-1为空栈 public: // 构造函数初始化栈 MyStack() { topIndex = -1; } // 判断栈是否为空 bool isEmpty() { return topIndex == -1; } // 判断栈是否满 bool isFull() { return topIndex == MAX - 1; } // 入栈 bool push(int num) { if (isFull()) { cout << "栈已满,无法入栈" << endl; return false; } arr[++topIndex] = num; return true; } // 出栈,删除栈顶元素 bool pop() { if (isEmpty()) { cout << "栈为空,无法出栈" << endl; return false; } topIndex--; return true; } // 获取栈顶元素 int getTop() { if (isEmpty()) { cout << "栈为空" << endl; return -9999; } return arr[topIndex]; } // 获取当前栈中元素个数 int getSize() { return topIndex + 1; } // 打印所有栈内元素 void show() { if (isEmpty()) { cout << "栈内无元素" << endl; return; } cout << "栈底 -> 栈顶:"; for (int i = 0; i <= topIndex; i++) { cout << arr[i] << " "; } cout << endl; } }; // 主函数测试 int main() { MyStack st; st.push(11); st.push(22); st.push(33); st.show(); cout << "栈顶元素:" << st.getTop() << endl; cout << "当前栈大小:" << st.getSize() << endl; st.pop(); cout << "执行出栈后:" << endl; st.show(); st.pop(); st.pop(); st.pop(); // 空栈出栈测试 return 0; }

可以看出在C++没有使用在没有使用内置<stack>的情况下会,在C语言中经常性需要&st 的操作没有,通过st.代理了平常的&st 的操作,相比C语言更加美观,和便捷性提升了很多。

练习题答案:

1,C 2, B

1,地址即使为空指针也还是可以正常的使用对应的类成员函数的

2,因为this->_a ,this 本身是空指针,直接触发崩溃

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询