类和对象(上)

[复制链接]
发表于 2026-2-8 02:33:15 | 显示全部楼层 |阅读模式
一、类的界说

        类有点类似c语言的结构体是一种自界说范例,但类内里除了界说一些成员变量外尚有方法(成员函数),在访问的时间要指定类域。
        在类界说时起首用一个class关键字,在反面接着类的名字,然后使用{ }在花括号内里界说成员变量和成员函数,末了必要在花括号外加分号,如下:
  1. class Stack
  2. {
  3.     void Init(int n = 4)
  4.     {
  5.         arr = (int*)malloc(sizeof(int) * n);
  6.         if (nullptr == arr)
  7.         {
  8.             perror("malloc申请空间失败");
  9.             return;
  10.         }
  11.         capacity = n;
  12.         size = 0;
  13.     }   
  14.     //......
  15.     int* arr;
  16.     size_t size;
  17.     size_t capacity;
  18. };
复制代码
这里calss也可以更换成struct,在类内里的函数默认都为内联函数,固然它不肯定都睁开具体还取决于编译器。
二、访问限定符

        在界说类的时间通常会用一些关键字来限定类成员的访问,访问限定符有public,private,protected。

  • public修饰的成员在类外可以直接被访问;protected和private修饰的成员在类外不能直接被访问,protected和private的具体区别这里先不讲授。
  • 访问权限作⽤域从该访问限定符出现的位置开始直到下⼀个访问限定符出现时为⽌,假如后⾯没有访问限定符,作⽤域就到}即类竣事。
  • class界说成员没有被访问限定符修饰时默以为private,struct默以为public
  • ⼀般成员变量都会被限定为private/protected,必要给别⼈使⽤的成员函数会放为public。
  1. class Stack
  2. {
  3. public:
  4.     void Init(int n = 4)
  5.     {
  6.         arr = (int*)malloc(sizeof(int) * n);
  7.         if (nullptr == arr)
  8.         {
  9.             perror("malloc申请空间失败");
  10.             return;
  11.         }
  12.         capacity = n;
  13.         size = 0;
  14.     }   
  15.     //......
  16. private:
  17.     int* arr;
  18.     size_t size;
  19.     size_t capacity;
  20. };
复制代码
三、类域

        类成员受到类域限定,在访问的时间必要指明类域,像定名空间一样使用::指明类域,假如一个函数声明在类里,界说在类外,那么在界说函数的时间就得使用::指明类域,如下:
  1. class Stack
  2. {
  3. public:
  4.     void Init(int n = 4);
  5.     //......
  6. private:
  7.     int* arr;
  8.     size_t size;
  9.     size_t capacity;
  10. };
  11. void Stack::Init(int n = 4)
  12. {
  13.     arr = (int*)malloc(sizeof(int) * n);
  14.     if (nullptr == arr)
  15.     {
  16.         perror("malloc申请空间失败");
  17.         return;
  18.     }
  19.     capacity = n;
  20.     size = 0;
  21. }  
复制代码
固然访问类域内的函数通常都使用类对象加点( . ) 操纵符去访问,如下:

四、实例化

        类就像是一栋房子的图纸,而用类去界说对象就类似使用图纸制作房子,这个过程就叫做实例化。
        类是不占用内存的,只有实例化后才会占内存,就像只有把图纸制作出房子后才占用土地一样。而那么盘算一个对象的内存呢?

五、对象的巨细

        对象与对象之间紧张区别在于成员变量的值,而同一个类的全部对象的成员函数都是一样的,以是成员函数并不储存在对象内里,只用思量成员变量所占的内存,而成员变量占用的内存和结构体的内存盘算方法一样,由于它们都存在内存对齐。必要留意的是静态成员并不是储存在对象内里(和成员函数同理),而是储存在静态区,不能算入。在类内里的静态成员与在全局申请的静态成员区别在于类成员受到类域的限定。
        假如一个类内里一个成员变量都没有那么按上面逻辑来说它实例化出来的对象占的空间应该是0,而对于这种情况编译器做了特殊处置惩罚,它所占的空间为1字节。
六、this指针

        类中有Init等成员函数,函数体中没有关于差别对象的区分,那当对象d1调⽤Init和别的函数时,该函数是怎样知道应该访问的是d1对象照旧d2对象呢?在这里C++给了⼀个隐含的this指针办理这⾥的题目。
        编译器编译后,类的成员函数默认都会在形参第⼀个位置,增长⼀个当前类范例的指针,叫做this指针。⽐如Stack类的Init的真实原型为, void Init(Stack* const this, int n=4)。                              C++规定不能在实参和形参的位置显⽰的写this指针(编译时编译器会处置惩罚),但是可以在函数体内表现使⽤this指针。
        类的成员函数中访问成员变量,本质都是通过this指针访问的,如Init函数中给size赋值, 可以看做this->size = 0;

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表