[源码下载]

不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象,  const 指针和指向 const 对象的指针, const 对象的引用

作者:webabcd

介绍
不可或缺 Windows Native 之 C++

  • this 指针
  • 对象数组
  • 对象和指针
  • const 对象
  • const 指针和指向 const 对象的指针
  • const 对象的引用

示例
1、CppEmployee 类
CppEmployee.h

  1. #pragma once
  2.  
  3. #include <string>
  4.  
  5. using namespace std;
  6.  
  7. namespace NativeDll
  8. {
  9. class CppEmployee
  10. {
  11.  
  12. int Number; // 默认为 private
  13.  
  14. private: // 以下都是 private 的
  15. string Name;
  16. bool IsMale;
  17.  
  18. protected: // 以下都是 protected 的
  19. string ToString();
  20.  
  21. public: // 以下都是 public 的
  22. float Salary;
  23. int Age;
  24. string Show();
  25.  
  26. // 构造函数(constructor),不定义的话,编译时会自动生成一个默认的不做任何事情的无参数构造函数(如果指定为 private 的话就可以禁止直接实例化,一般做单例模式的话会这么做)
  27. // 另外:如果声明了带参数的构造函数,则不会自动生成默认的无参数构造函数
  28. CppEmployee();
  29. CppEmployee(int number, string name = "webabcd"); // 可以为构造函数中的参数指定默认值(参考:CppFunction1.cpp)
  30. CppEmployee(int number, string name, bool isMale);
  31.  
  32. // 析构函数(destructor),对象被销毁时会调用,例如释放动态分配的内存等。不需要时也可以不定义,编译时会自动生成一个默认的不做任何事情的析构函数,析构函数的函数名与类名相同,前面有“~”
  33. ~CppEmployee();
  34.  
  35. private:
  36. // 注:在体内定义的成员函数,系统会自动将其作为 inline 函数处理(关于 inline 函数,参见:CppFunction2.cpp)
  37. void Temp()
  38. {
  39. int a = ;
  40. }
  41.  
  42. /*
  43. 下面这个与上面那个一样
  44. inline void Temp()
  45. {
  46. int a = 100;
  47. }
  48. */
  49.  
  50. };
  51. }

CppEmployee.cpp

  1. /*
  2. * CppEmployee 类
  3. */
  4.  
  5. #include "pch.h"
  6. #include "CppEmployee.h"
  7. #include "cppHelper.h"
  8.  
  9. using namespace NativeDll;
  10.  
  11. // “::”是作用域限定符(field qualifier)
  12. string CppEmployee::Show()
  13. {
  14. return int2string(Number) + " " + Name;
  15. }
  16.  
  17. string CppEmployee::ToString()
  18. {
  19. return int2string(Number) + " " + Name;
  20. }
  21.  
  22. // 无参数的构造函数
  23. CppEmployee::CppEmployee()
  24. {
  25. Number = ;
  26. Name = "webabcd";
  27. }
  28.  
  29. // 有参数的构造函数,可以在声明中为参数指定默认值
  30. CppEmployee::CppEmployee(int number, string name)
  31. {
  32. Number = number;
  33. Name = name;
  34. }
  35.  
  36. // 可以通过下面这种简单的方式,将构造函数中的参数值赋值给对象的变量
  37. CppEmployee::CppEmployee(int number, string name, bool isMale) :Number(number), Name(name), IsMale(isMale)
  38. {
  39.  
  40. }
  41.  
  42. CppEmployee::~CppEmployee()
  43. {
  44.  
  45. }

2、演示 this 指针, 对象数组, 对象和指针, const 对象,  const 指针和指向 const 对象的指针, const 对象的引用
CppClass2.h

  1. #pragma once
  2.  
  3. #include <string>
  4.  
  5. using namespace std;
  6.  
  7. namespace NativeDll
  8. {
  9. class CppClass2
  10. {
  11. private:
  12. string Name;
  13.  
  14. public:
  15. string Demo();
  16. };
  17. }

CppClass2.cpp

  1. /*
  2. * this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, const 对象的引用
  3. */
  4.  
  5. #include "pch.h"
  6. #include "CppClass2.h"
  7. #include "CppEmployee.h"
  8.  
  9. using namespace NativeDll;
  10.  
  11. void cppclass2_demo1();
  12. void cppclass2_demo2();
  13. void cppclass2_demo3();
  14. void cppclass2_demo4();
  15. void cppclass2_demo5();
  16.  
  17. string CppClass2::Demo()
  18. {
  19. // 什么是 this 指针:
  20. // 在每一个成员函数中都包含一个特殊的指针,即 this 指针。它是指向本类对象的指针,它的值是当前被调用的成员函数所在的对象的起始地址
  21. this->Name = "abc";
  22. string name = (*this).Name;
  23.  
  24. // 对象数组
  25. cppclass2_demo1();
  26.  
  27. // 对象和指针
  28. cppclass2_demo2();
  29.  
  30. // const 对象
  31. cppclass2_demo3();
  32.  
  33. // const 指针和指向 const 对象的指针
  34. cppclass2_demo4();
  35.  
  36. // const 对象的引用
  37. cppclass2_demo5();
  38.  
  39. return "看代码及注释吧";
  40. }
  41.  
  42. // 对象数组
  43. void cppclass2_demo1()
  44. {
  45. // 对象数组
  46. CppEmployee employees[] =
  47. {
  48. CppEmployee(, "name1"),
  49. CppEmployee(, "name2"),
  50. CppEmployee(, "name3")
  51. };
  52.  
  53. // 数组名 employees 就是该数组的首地址
  54. employees->Show(); // 1 name1
  55. }
  56.  
  57. // 对象和指针
  58. void cppclass2_demo2()
  59. {
  60. CppEmployee employee(, "webabcd");
  61.  
  62. // 指向对象的指针
  63. CppEmployee *p1 = &employee;
  64. p1->Salary = ;
  65.  
  66. // 指向对象中的指定属性的指针
  67. float *p2 = &employee.Salary; // . 的优先级高
  68.  
  69. // 函数指针(指向函数的指针)
  70. string (CppEmployee::*p3)(); // 定义一个函数指针。此函数为 CppEmployee 类中的一个 public 函数,其无参数,返回值为 string 类型
  71. p3 = &CppEmployee::Show; // 使 p3 指向 CppEmployee 类中的 public 函数 Show
  72. string result = (employee.*p3)(); // 调用对象 employee 中 p3 所指的函数
  73.  
  74. string(CppEmployee::*p4)() = &CppEmployee::Show;
  75. result = (employee.*p4)(); // 1 webabcd
  76. }
  77.  
  78. namespace NativeDll
  79. {
  80. class CppEmployeeConst
  81. {
  82.  
  83. public:
  84. float Salary;
  85. int Age;
  86. mutable int Num; // mutable 属性,即使对象是 const 对象的话,也可以设置其 mutable 属性
  87. const string Name; // const 数据成员
  88. const boolean IsMale; // const 数据成员
  89.  
  90. string Show() const // const 成员函数(注意 const 写在后面)
  91. {
  92. // const 函数不能调用非 const 函数
  93. // return this->ToString();
  94.  
  95. return "abc";
  96. }
  97.  
  98. string ToString()
  99. {
  100. return "abc";
  101. }
  102.  
  103. // 必须提供一个构造函数,用以初始化所有 const 数据成员
  104. CppEmployeeConst(string name) :Name(name), IsMale(true)
  105. {
  106. this->Age = ;
  107. }
  108. };
  109. }
  110.  
  111. // const 对象
  112. void cppclass2_demo3()
  113. {
  114. // 实例化一个非 const 对象
  115. CppEmployeeConst employee("webabcd");
  116. // 不能修改对象中的 const 属性
  117. // employee.IsMale = true;
  118.  
  119. // 实例化一个 const 对象
  120. // CppEmployeeConst const employeeConst;
  121. const CppEmployeeConst employeeConst("webabcd");
  122.  
  123. // 可以获取 const 对象中的 const 属性和非 const 属性
  124. string name = employee.Name;
  125. int age = employee.Age;
  126.  
  127. // 不能设置 const 对象中的 const 属性和非 const 属性
  128. // employee.Salary = 100;
  129. // employee.Name = "wanglei";
  130.  
  131. // 可以设置 const 对象中的 mutable 属性
  132. employee.Num = ;
  133.  
  134. // 可以调用 const 对象中的 const 函数,不能调用非 const 函数
  135. employee.Show();
  136. // employee.ToString();
  137. }
  138.  
  139. // const 指针和指向 const 对象的指针
  140. void cppclass2_demo4()
  141. {
  142. CppEmployee employee(, "webabcd");
  143. CppEmployee employee2(, "webabcd");
  144.  
  145. // const 指针:指针始终指向同一个对象(指针是 const 的)
  146. CppEmployee *const p1 = &employee;
  147. // p1 = &employee2; // 编译错误,因为指针是 const 的,不能对其赋值
  148.  
  149. // 指向 const 对象的指针(所指的对象是 const 的)
  150. const CppEmployee *p2 = &employee;
  151. // p2->Salary = 100; // 编译错误,因为所指的对象是 const 的,不能对其属性赋值
  152.  
  153. // 当使用指针的方式传参时,如果不希望在函数中修改其所指的对象,则可以这么做
  154. void cppclass2_function1(const CppEmployee *p);
  155. cppclass2_function1(&employee);
  156. }
  157.  
  158. void cppclass2_function1(const CppEmployee *p)
  159. {
  160. // 不能在此函数中修改 p 所指对象
  161. // p->Salary = 100;
  162. }
  163.  
  164. // const 对象的引用
  165. void cppclass2_demo5()
  166. {
  167. CppEmployee employee(, "webabcd");
  168. CppEmployee employee2(, "webabcd");
  169.  
  170. // const 对象的引用(被引用的对象是 const 的)
  171. const CppEmployee &r = employee;
  172. // r.Salary = 100; // 编译错误,因为被引用的对象是 const 的,不能对其属性赋值
  173.  
  174. // 当使用引用的方式传参时,如果不希望在函数中修改其引用的对象,则可以这么做
  175. void cppclass2_function2(const CppEmployee &r);
  176. cppclass2_function2(r);
  177. cppclass2_function2(employee);
  178. }
  179.  
  180. void cppclass2_function2(const CppEmployee &r)
  181. {
  182. // 不能在此函数中修改 r 所引用的对象
  183. // r.Salary = 100;
  184. }

OK
[源码下载]

不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, const 对象的引用的更多相关文章

  1. 不可或缺 Windows Native 系列文章索引

    [源码下载] 不可或缺 Windows Native 系列文章索引 作者:webabcd 1.不可或缺 Windows Native (1) - C 语言: hello c 介绍不可或缺 Window ...

  2. 不可或缺 Windows Native (19) - C++: 对象的动态创建和释放, 对象的赋值和复制, 静态属性和静态函数, 类模板

    [源码下载] 不可或缺 Windows Native (19) - C++: 对象的动态创建和释放, 对象的赋值和复制, 静态属性和静态函数, 类模板 作者:webabcd 介绍不可或缺 Window ...

  3. 不可或缺 Windows Native (17) - C++: 类与对象

    [源码下载] 不可或缺 Windows Native (17) - C++: 类与对象 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 类与对象 示例1.类的设计CppE ...

  4. 不可或缺 Windows Native (7) - C 语言: 指针

    [源码下载] 不可或缺 Windows Native (7) - C 语言: 指针 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 指针 示例cPointer.h #i ...

  5. 不可或缺 Windows Native (23) - C++: 虚函数

    [源码下载] 不可或缺 Windows Native (23) - C++: 虚函数 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 虚函数 示例1.基类CppHuman ...

  6. 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成员)

    [源码下载] 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成 ...

  7. 不可或缺 Windows Native (13) - C++: 标准输入, 标准输出, 字符串内存流

    [源码下载] 不可或缺 Windows Native (13) - C++: 标准输入, 标准输出, 字符串内存流 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 标准输 ...

  8. 不可或缺 Windows Native (12) - C++: 引用类型

    [源码下载] 不可或缺 Windows Native (12) - C++: 引用类型 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 引用类型 示例CppReferen ...

  9. 不可或缺 Windows Native (4) - C 语言: 预处理命令,输入,输出

    [源码下载] 不可或缺 Windows Native (4) - C 语言: 预处理命令,输入,输出 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 预处理命令 输入 ...

随机推荐

  1. Objective-C 随机数

    有个项目要给客户发送随机验证码, 试了下这样可以 srand(time()); code = [NSString stringWithFormat: - )) + ];

  2. Nodejs·内存控制

    之前有考虑过Node中的内存管理,但是没想到Node的内存机制与JVM如此相像. 看完这部分的内容,基本可以了解Node中的内存使用技巧: 1 尽量不要做过多的缓存 2 使用队列应该有限制 3 注意全 ...

  3. Maven项目环境搭建实例.

    前言:最近下班比较早, 总是不愿意让自己闲着, 此时刚好从网上找到了一些项目的资源, 结合自己在公司做的项目, 所以拿来一起学习加复习一些平常用到和没接触过的新知识.做的这个项目的名称叫做babasp ...

  4. 容器使用的12条军规——《Effective+STL中文版》试读

    容器使用的12条军规——<Effective+STL中文版>试读     还 记的自己早年在学校学习c++的时候,老师根本就没有讲STL,导致了自己后来跟人说 起会C++的时候总是被鄙视, ...

  5. 神马是 NaN,它的类型是神马?怎么测试一个值是否等于 NaN?

    NaN 是 Not a Number 的缩写,JavaScript 的一种特殊数值,其类型是 Number,可以通过 isNaN(param) 来判断一个值是否是 NaN: console.log(i ...

  6. 面试小记---外部脚本必须包含 <script> 标签吗?

    外部脚本必须包含 <script> 标签吗? 答案是否定的. 身为小白的我一开始也是以为这句话的对了,因为本来嘛,引用外部脚本不都用的是<script>标签中的src属性吗.所 ...

  7. NYOJ995硬币找零(简单dp)

    /* 题意:给你不同面额的硬币(每种硬币无限多),需要找零的面值是T,用这些硬币进行找零, 如果T恰好能被找零,输出最少需要的硬币的数目!否则请输出剩下钱数最少的找零方案中的最少硬币数! 思路:转换成 ...

  8. C#搭建足球赛事资料库与预测平台(1) 基本介绍

            本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源C#彩票数据资料库系列文章总目录:[目录]C#搭建足球赛事资料库与预测平台与彩票数据分析目录 去年4月到现在,一年 ...

  9. php易混淆知识点

    一.define(“constant”,  “hello world”);和const constant = “hello world”;的区别? (0).使用const使得代码简单易读,const本 ...

  10. HTML5移动Web开发(一)——HTML5和移动网站基本概念以及一些模拟器

    当前,手机设备发展迅猛.屏幕尺寸各不相同.存储和性能仍有局限性,如何结合HTML5的功能,在多平台上创建高性能.响应式的移动网站,是Web开发者所要面对的首要挑战.HTML5以及移动网站都是很有前景的 ...