深度剖析C++第二部分

1、通过对象名能够访问public成员变量。每个对象的成员变量都是专属的,成员变量不能够在对象之间共享。

2、需求:统计在程序运行期间某个类的对象数目,保证程序的安全性(不能使用全局变量),随时可以获取当前对象的数目。

(1)使用全局变量的情况

  1. #include <iostream.h>
  2. #include <stdio.h>
  3. int count;
  4. int getCount()
  5. {
  6. return count;
  7. }
  8. class Test{
  9. public:
  10. Test()
  11. {
  12. count++;
  13. }
  14. ~Test()
  15. {
  16. --count;
  17. }
  18. };
  19. Test t0;
  20. Test t1;
  21. int main(int argc, char *argv[])
  22. {
  23. Test t;
  24. printf("count:%d\n",getCount());
  25. return 0;
  26. }

(2)使用static变量的情况

  1. #include <iostream.h>
  2. #include <stdio.h>
  3. class Test{
  4. private:
  5. static int count; //静态成员变量
  6. public:
  7. Test()
  8. {
  9. count++;
  10. }
  11. ~Test()
  12. {
  13. --count;
  14. }
  15. static int getCount() //静态成员函数
  16. {
  17. //printf("count:%d\n",count);
  18. return count;
  19. }
  20. };
  21. int Test::count=0; //类的静态成员变量必须先初始化再使用 另外占用空间(全局数据区空间)
  22. Test t0;
  23. Test t1;
  24. int main(int argc, char *argv[])
  25. {
  26. Test t;
  27. printf("count:%d\n",Test::getCount());
  28. //t.getCount();
  29. return 0;
  30. }

3、关于类的静态成员变量,通常情况下都是定义为public的,因为静态成员变量的生命周期不依赖于任何一个对象,静态成员变量属于整个类所有,所有对象共享类的静态成员变量,我们可以通过类名直接访问公有静态成员变量,也可以通过对象名访问公有静态成员变量。

因为静态成员变量不属于某一个特定的对象所有,所以他不能分配在 对象空间上,因此它需要在类外单独分配空间,它的存储在全局数据区。静态成员变量的生命期为程序运行期。类中可以通过static关键字定义静态成员变量。

在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用。所以在所有对象中都可以共享它。使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节省内存。

不能通过类名来调用类的非静态成员函数,只能调用类的静态成员函数和静态成员变量。类的对象可以使用静态成员函数和非静态成员函数。静态成员函数中不能引用非静态成员(因为静态成员函数属于整个类,在类实例化对象之前就已经分配空间了,而类的非静态成员必须在类实例化对象后才有内存空间,所以这个调用就出错了,就好比没有声明一个变量却提前使用它一样。);类的非静态成员函数可以调用用静态成员函数,但反之不能。类的静态成员变量必须先初始化再使用。

对类的静态成员变量和成员函数作个总结:

一。静态成员函数中不能调用非静态成员。

二。非静态成员函数中可以调用静态成员。因为静态成员属于类本身,在类的对象产生之前就已经存在了,所以在非静态成员函数中是可以调用静态成员的。

三。静态成员变量使用前必须先初始化(如int MyClass::m_nNumber = 0;),否则会在linker时出错

参考博客:http://blog.csdn.net/morewindows/article/details/6721430

静态成员函数只能访问静态成员变量或静态成员函数,而不能访问普通成员函数,因为静态成员函数在对象构造前就已经分配 了存储空间。

静态成员函数可以通过类名直接访问,也可以通过对象名直接访问,静态成员函数没有隐藏的this参数。

4、二阶构造模式   参考博客:http://blog.csdn.net/lgc_lg/article/details/54783242

构造函数中可以使用return语句,构造函数执行结束不一定说明对象就构造成功了。构造函数只是决定对象的初始状态,而不能决定对象的诞生。半成品对象:构造函数的初始化过程不能按照预期的计划完成构造而形成的对象,半成品对象也是合法的c++对象,但也是BUG的重要来源。构造函数中初始化操作失败不影响对象的诞生。

二阶构造是人为的将初始化过程分为两个部分,二阶构造的根本意义在于保证创建的 对象都是完整初始化的,不存在半成品对象。

工程开发中的构造过程分为:

(1)资源无关的初始化操作:不可能出现异常情况的操作

(2)需要使用系统资源的操作:可能出现异常情况:如 :内存申请、文件访问、定义指针等

程序代码示例:

  1. #include <stdio.h>
  2. class TwoPhaseCons
  3. {
  4. private:
  5. TwoPhaseCons() // 第一阶段构造函数
  6. {
  7. }
  8. bool construct() // 第二阶段构造函数
  9. {
  10. return true;
  11. }
  12. public:
  13. static TwoPhaseCons* NewInstance(); // 对象创建函数
  14. };
  15. TwoPhaseCons* TwoPhaseCons::NewInstance()
  16. {
  17. TwoPhaseCons* ret = new TwoPhaseCons();
  18. // 若第二阶段构造失败,返回 NULL
  19. if( !(ret && ret->construct()) )
  20. {
  21. delete ret;
  22. ret = NULL;
  23. }
  24. return ret;
  25. }
  26. int main()
  27. {
  28. TwoPhaseCons* obj = TwoPhaseCons::NewInstance();
  29. printf("obj = %p\n", obj);
  30. delete obj;
  31. return 0;
  32. }

5、友元关系发生在函数与类之间或者类与类之间,友元关系是单项的,不能传递。在类中以friend关键字来声明友元,类的友元可以是其他类或者具体函数。友元不是类的一部分,友元不受类中访问级别的限制,友元可以访问具体类的所有成员。在类中用friend关键字对函数或类进行声明

友元关系不具备传递性,类的友元可以是其他类的成员函数,也可以是某个完整的类。

代码示例一:类与类之间作为友元

  1. #include<iostream>
  2. #include<stdio.h>
  3. class TestA{
  4. private: friend class TestB;
  5. int j;
  6. public:
  7. TestA()
  8. {
  9. j=11;
  10. }
  11. };
  12. class TestB{
  13. private: friend class TestC;
  14. int i;
  15. public:
  16. TestB()
  17. {
  18. i=10;
  19. }
  20. /* int get(TestA obj) 友元不具有传递性
  21. {
  22. return obj.j;
  23. }
  24. */
  25. };
  26. class TestC{
  27. public:
  28. int get (TestB obj)
  29. {
  30. return obj.i;
  31. }
  32. int get (TestA obj)
  33. {
  34. return obj.j;
  35. }
  36. };
  37. int main()
  38. {
  39. TestC c;
  40. TestB b;
  41. TestA a;
  42. printf("c.get(b)=%d\n",c.get(b));
  43. printf("b.get(a)=%d\n",b.get(a));
  44. //printf("%d\n",c.get(a)); error 友元在类之间不具有传递性
  45. return 0;
  46. }

代码示例二:成员函数作为一个类的友元

  1. #include<iostream>
  2. #include<stdio.h>
  3. class TestA{
  4. private:
  5. int j;
  6. public:
  7. TestA()
  8. {
  9. j=11;
  10. }
  11. friend int getJ(TestA obj); //友元声明 函数作为一个类的友元
  12. };
  13. int getJ(TestA obj)
  14. {
  15. return obj.j;
  16. }
  17. int main()
  18. {
  19. TestA a;
  20. printf("%d\n",getJ(a));
  21. return 0;
  22. }

代码示例三:

代码从示例四:

6、函数重载的本质为相互独立的不同函数,c++中通过函数名和函数参数确定函数调用,所以说无法直接通过函数名得到重载函数的入口地址,函数重载必然发生在同一个作用域中。(类作用域、全局作用域、局部作用域等) 全局函数和成员函数是不能够进行重载关系的。

构造函数的重载     普通成员函数的重载    静态成员函数的重载

函数重载的意义:(1)扩展系统中已经存在的函数功能(2)扩展系统中不存在的功能

7、操作符重载

c++中的重载能够扩展操作符的功能,操作符的重载以函数的方式进行,本质是用特殊形式的函数扩展操作符的功能。

通过operator关键字可以定义特殊的函数,operator的本质是通过函数重载操作符

操作符重载遵循相同的函数重载规则 ,全局函数和成员函数都可以实现对操作符的重载。

(3.1)狄泰软件学院C++课程学习剖析二的更多相关文章

  1. (3.3)狄泰软件学院C++课程学习剖析四

    对课程前面40课的详细回顾分析(二) 1.一个类的成员变量是对于每个对象专有的,但是成员函数是共享的. 2.构造函数只是决定一个对象的初始化状态,而不能决定对象的诞生.二阶构造人为的将初始化过程分为了 ...

  2. (3.2)狄泰软件学院C++课程学习剖析三

    对课程前面40课的详细回顾分析(一) 0. int main() { // ① Array t(3,3); //普通模式 // ② Array *t=new Array(3,3); //指针方式 // ...

  3. (3)狄泰软件学院C++课程学习剖析一

    深度剖析C++第一部分 1.类是一种模型,这种模型可以创建出一个对应的实体.有了类不一定有对应的实体,但是一个实体必定属于某一个类. 2.类用于抽象的描述 一类事物所持有的属性和行为:对象是具体的事物 ...

  4. UFLDL课程学习(二)

    章节地址:http://ufldl.stanford.edu/tutorial/supervised/LogisticRegression/ 章节名称:逻辑回归 (Logisitic Regressi ...

  5. SpringBoot课程学习(二)

    一.断言 (1).@assertTrue,@assertFalse assertTrue与assertFalse用来判断条件是否为true或false,assertTrue表示如果值为true则通过, ...

  6. 团队项目评审&课程学习总结

    一:实验名称:团队项目评审&课程学习总结 二:实验目的与要求 (1)掌握软件项目评审会流程: (2)反思总结课程学习内容. 三:实验步骤 任务一:按照团队项目结对评审名单,由项目组扮演乙方,结 ...

  7. 201671010403 陈倩倩 实验十四 团队项目评审&课程学习总结

    一:实验名称:团队项目评审&课程学习总结 二:实验目的与要求 (1)掌握软件项目评审会流程: (2)反思总结课程学习内容. 三:实验步骤 任务一:按照团队项目结对评审名单,由项目组扮演乙方,结 ...

  8. 201671010436 王雪刚 实验十四 团队项目评审&课程学习总结

    一:实验名称:团队项目评审&课程学习总结 二:实验目的与要求 (1)掌握软件项目评审会流程: (2)反思总结课程学习内容. 三:实验步骤 任务一:按照团队项目结对评审名单,由项目组扮演乙方,结 ...

  9. 王之泰《面向对象程序设计(java)》课程学习总结

    第一部分:理论知识学习部分 总复习纲要 1. Java语言特点与开发环境配置(第1章.第2章) 2. Java基本程序结构(第3章) 3. Java面向对象程序结构(第4章.第5章.第6章) 4. 类 ...

随机推荐

  1. VS2013中使用本地IIS+域名调试ASP.NET项目

    VS2013中使用本地IIS+域名调试ASP.NET项目 在有些情况下需要使用本地的IIS作为调试服务器,如支持多域名的网站,这里记录下如何使用. 1.修改本机hosts文件. 路径:C:\Windo ...

  2. 山西汽车销量(hive)

    1.创建数据库create database db_cart; 2.使用数据库use db_cart; 3.创建表create table t_cart(province STRING,month I ...

  3. [Web 前端] 004 html 小练习

    1. 锚点 用法 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> < ...

  4. (4.23)SQL Server中的加密

    转自:https://www.cnblogs.com/CareySon/archive/2012/04/01/SQL-SERVER-Encryption.html 简介 加密是指通过使用密钥或密码对数 ...

  5. 加密算法:DES、AES等

    指标:运算速度.安全性.资源消耗 对称加密算法(加解密密钥相同): 非对称算法(加密密钥和解密密钥不同): 散列算法比较: 对称与非对称算法比较: 算法选择(从性能和安全性综合) 对称加密: AES( ...

  6. ECharts-第一篇最简单的应用

    1.简单演示一个饼状图 准备好echarts-all.js 2.编写页面代码 <!DOCTYPE html> <html> <head> <meta char ...

  7. 说说 HTTP 和 HTTPS 区别??

    HTTP 协议传输的数据都是未加密的,也就是明文的,因此使用 HTTP 协议传输隐私信息非常不安全,为了保证这些隐私数据能加密传输,于是网景公司设计了 SSL(Secure Sockets Layer ...

  8. vue访问外部接口设置代理,解决跨域(vue-cli3.0)

    vue-cli3.0搭建的项目,平时访问内部接口配置了拦截器,今天需要调用天气预报的外部接口,发现跨域问题,通过配置代理解决. 1.在vue.config.js中配置代理 module.exports ...

  9. vs code 同步

    vs code 同步需要在github上配置好gist id, 将gist id添加至setting.json中, 然后再在localsetting中设置access token,  gist id ...

  10. mssql 取数据指定条数(例:100-200条的数据)

    方法1:临时表 * into #aa from table order by time-- 将top m笔插入 临时表 select * from #aa order by time desc --d ...