经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C » 查看文章
清华大学《C++语言程序设计基础》线上课程笔记02---类与对象
来源:cnblogs  作者:中庭之园  时间:2018/10/20 15:33:54  对本文有异议

类与对象

public是类的对外访问接口;

类内初始值

  1. 在定义类时对数据成员写初始值,在创建对象的时候,会使用类内初始值初始化数据成员;
  2. class Clock {
  3. public:
  4. void showTime();
  5. private:
  6. int hour = 0, minute = 0, second = 0;
  7. };

private成员

默认只能被类内函数访问;
类外函数可以通过友元方式取得授权进行访问;

protected成员

和private成员类似,其差别表现在继承派生时对派生类的影响不同;
类外对象也无法访问.

类的成员函数

1.对于复杂的函数,在类中说明函数原型,在类外给出函数体实现,并在函数名前使用类名加以限定;
2.对于简单的函数可以直接写在类的类体中,也可以和复杂函数一样定义在外面,也可以定义在外面的同时加上inline关键字;

默认构造函数

调用时可以不需要实参的构造函数
1.参数表为空的构造函数;
2.全部参数都有默认值的构造函数.

  1. 下面两个都是默认构造函数,如在类中同时出现,将产生编译错误:
  2. Clock();
  3. Clock(int newH=0,int newM=0,int newS=0);

“ =default”

可以在制定系统生成一个默认构造函数;

  1. class Clock {
  2. public:
  3. Clock() =default; //指示编译器提供默认构造函数
  4. ...
  5. };

手动建立默认构造函数是一个好的习惯,因为有时候会像

  1. int a
  2. Clock c

一样并不会在创建对象时紧跟着赋初始值,此时如果没有默认构造函数,编译便会报错。
可以使用初始化列表进行构造;

  1. class Clock {
  2. public:
  3. Clock(int newH, int newM, int newS); //构造函数
  4. Clock(); //默认构造函数void setTime(int newH, int newM, int newS);
  5. void showTime();
  6. private:
  7. int hour, minute, second;
  8. };
  9. Clock::Clock(): hour(0),minute(0),second(0){ }//默认构造函数

委托构造函数

使用类的其他构造函数执行初始化过程;

类中往往有多个构造函数,只是参数表和初始化列表不同,其初始化算法都是相同的,这时,为了避免代码重复,可以使用委托构造函数。

优点在于可以保持代码的一致性,一处修改,其他地方便无需修改.

  1. 已有
  2. Clock(int newH, int newM, int newS) : hour(newH),minute(newM), second(newS) {//构造函数}
  3. 那么
  4. Clock(): hour(0),minute(0),second(0) { }//默认构造函数
  5. 可以改写为
  6. Clock(): Clock(0, 0, 0) { }

复制构造函数

是一种特殊的构造函数,其形参为本类的对象引用。作用是用一个已存在的对象去初始化同类型的新对象。

  1. class 类名 {
  2. public :
  3. 类名(形参);//构造函数
  4. 类名(const 类名 &对象名);//复制构造函数
  5. // ...
  6. };
  7. 类名::类( const 类名 &对象名)//复制构造函数的实现;
  8. { 函数体 }

p.s.此处使用了常引用,既使用了引用,又防止了引用的双向传递使得数据被改变。而使用引用,是为了避免拷贝构造函数无限制的递归下去。

“ =delete”

C++11做法:用“ =delete”指示编译器不生成默认复制构造函数。

  1. Point(const Point& p) =delete; //指示编译器不生成默认复制构造函数

默认的复制构造函数只能对数据进行一一对应的复制,且对于含有指针的成员在复制时可能发生问题,并且当有一些特殊的“复制”要求,如部分复制等,此时则需要自行设计复制构造函数。

类的组合

1.类中的成员是另一个类的对象;
2.可以在已有抽象的基础上实现更复杂的抽象。

除了普通的初始化,也需要对来自其他类的成员进行初始化;
使用初始化列表,按照声明次序依次调用构造函数,初始化列表中没有的类成员使用默认构造函数(可见写默认构造函数是个好习惯)。

前向引用声明

A与B互相引用,不知道该谁先谁后时

  1. class B; //前向引用声明
  2. class A {
  3. public:
  4. void f(B b); //可用作参数类型
  5. };
  6. class B {
  7. public:
  8. void g(A a);
  9. };

不是万能的,不能涉及类的任何细节;可用作参数类型,但不可以实例化对象

  1. class Fred; //前向引用声明
  2. class Barney {
  3. Fred x; //错误:类Fred的声明尚不完善,不可实例化对象
  4. };
  5. class Fred {
  6. Barney y;
  7. };
  8. 正确方法:
  9. class Fred; //前向引用声明
  10. class Barney {
  11. Fred *x; //使用对象指针,配合Fred类中的动态内存分配
  12. };
  13. class Fred {
  14. Barney y;
  15. };

结构体

结构体是一种特殊形态的类

与类的唯一区别:类的缺省访问权限是private,结构体的缺省访问权限是
public;
结构体存在的主要原因:与C语言保持兼容

  1. struct 结构体名称 {
  2. 公有成员
  3. protected:
  4. 保护型成员
  5. private:
  6. 私有成员
  7. }

联合体

1.成员共用同一组内存单元;
2.任何两个成员不会同时有效;
3.缺省访问权限是public.

  1. union 联合体名称 {
  2. 公有成员
  3. protected:
  4. 保护型成员
  5. private:
  6. 私有成员
  7. };

枚举类

enum class 枚举类型名: 底层类型 {枚举值列表};

不写底层类型,默认int;

  1. enum class Category { General=1, Pistol, MachineGun, Cannon};

枚举类的优势

1.强作用域,其作用域限制在枚举类中;

  1. 使用Type的枚举值General
  2. Type::General

2.转换限制,枚举类对象不可以与整型隐式地互相转换;

  1. 不同枚举类不能直接比较

3.可以指定底层类型

  1. enum class Type: char { General, Light, Medium, Heavy};
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号