ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

【C++】 类与对象(一)(class 类的定义)

【C++】 类与对象(一)(class 类的定义) 目录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 n4); 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(_arrayNULL) { perror(malloc); exit(1); } _capacityn; _top0; } 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 n4); private: int* _array; size_t _capacity; size_t _top; };以上面代码为例this-_array[0],this-_capacity,this-_top 等等都是可以充分使用到实例化对象的每一个成员变量但是在类域中无需这么去写无需写入this 正常使用变量名我们还是可以用到对应的变量的this 的最大用处之一是来充当return的返回值注意是之一this 的用处还不止这么有关只要知道this 是实例化对象的地址*this 的实例化对象即可。补充this 指针存在在栈区上题目练习#includeiostream 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、正常运⾏#includeiostream 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语言更加美观和便捷性提升了很多。练习题答案1C 2 B1地址即使为空指针也还是可以正常的使用对应的类成员函数的2因为this-_a ,this 本身是空指针直接触发崩溃
返回列表