类与对象

public是类的对外访问接口;

类内初始值

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

private成员

默认只能被类内函数访问;

类外函数可以通过友元方式取得授权进行访问;

protected成员

和private成员类似,其差别表现在继承派生时对派生类的影响不同;

类外对象也无法访问.

类的成员函数

1.对于复杂的函数,在类中说明函数原型,在类外给出函数体实现,并在函数名前使用类名加以限定;

2.对于简单的函数可以直接写在类的类体中,也可以和复杂函数一样定义在外面,也可以定义在外面的同时加上inline关键字;

默认构造函数

调用时可以不需要实参的构造函数

1.参数表为空的构造函数;

2.全部参数都有默认值的构造函数.

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

“ =default”

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

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

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

int a;
Clock c;

一样并不会在创建对象时紧跟着赋初始值,此时如果没有默认构造函数,编译便会报错。

可以使用初始化列表进行构造;

class Clock {
public:
Clock(int newH, int newM, int newS); //构造函数
Clock(); //默认构造函数void setTime(int newH, int newM, int newS);
void showTime();
private:
int hour, minute, second;
}; Clock::Clock(): hour(0),minute(0),second(0){ }//默认构造函数

委托构造函数

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

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

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

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

复制构造函数

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

class 类名 {
public :
类名(形参);//构造函数
类名(const 类名 &对象名);//复制构造函数
// ...
};
类名::类( const 类名 &对象名)//复制构造函数的实现;
{ 函数体 }

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

“ =delete”

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

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

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

类的组合

1.类中的成员是另一个类的对象;

2.可以在已有抽象的基础上实现更复杂的抽象。

除了普通的初始化,也需要对来自其他类的成员进行初始化;

使用初始化列表,按照声明次序依次调用构造函数,初始化列表中没有的类成员使用默认构造函数(可见写默认构造函数是个好习惯)。

前向引用声明

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

class B;  //前向引用声明

class A {
public:
void f(B b); //可用作参数类型
}; class B {
public:
void g(A a);
};

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

class Fred; //前向引用声明

class Barney {
Fred x; //错误:类Fred的声明尚不完善,不可实例化对象
}; class Fred {
Barney y;
}; 正确方法:
class Fred; //前向引用声明 class Barney {
Fred *x; //使用对象指针,配合Fred类中的动态内存分配
}; class Fred {
Barney y;
};

结构体

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

与类的唯一区别:类的缺省访问权限是private,结构体的缺省访问权限是

public;

结构体存在的主要原因:与C语言保持兼容

struct 结构体名称 {
公有成员
protected:
保护型成员
private:
私有成员
}

联合体

1.成员共用同一组内存单元;

2.任何两个成员不会同时有效;

3.缺省访问权限是public.

union 联合体名称 {
公有成员
protected:
保护型成员
private:
私有成员
};

枚举类

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

不写底层类型,默认int;

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

枚举类的优势

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

使用Type的枚举值General:
Type::General

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

不同枚举类不能直接比较

3.可以指定底层类型

enum class Type: char { General, Light, Medium, Heavy};

清华大学《C++语言程序设计基础》线上课程笔记02---类与对象的更多相关文章

  1. 清华大学《C++语言程序设计基础》线上课程笔记03---数据的共享和保护&数组

    数据的共享和保护 对象的生存期 static类型的局部变量,生存期在整个程序,局部可见. void example() { static a=1; int b=2 } 当调用完example函数后,b ...

  2. 清华大学《C++语言程序设计基础》线上课程笔记04---指针

    指针 static int i; static int* ptr = &i; 此处的*表示ptr是指针类型(地址类型),用来存放目标数据的地址 其本身也有地址,所以又指向指针的指针; *前面的 ...

  3. 清华大学《C++语言程序设计进阶》线上课程笔记06---继承、派生、多态性

    类的继承 保持已有类的特性而构造新类的过程称为继承; 实现设计与代码的重用. 在已有类的基础上新增自己的特性而产生新类的过程称为派生 当新的问题出现,原有程序无法解决(或不能完全解决)时,需要对原有程 ...

  4. 清华大学《C++语言程序设计基础》线上课程笔记01---基础概念与一些注意事项

    使用除法的注意事项 double b = 4.0 * 1/239.0; 因为整数相除结果取整,如果参数写1/239,结果就都是0 浮点数注意事项 浮点数是近似存储,所以不能直接比较两个浮点数的大小, ...

  5. 清华大学《C++语言程序设计基础》线上课程笔记05---vector对象,对象的复制与移动,string类

    vector 对象 C++标准库中的一个类模板 封装任何类型的动态数组,自动创建和删除. 数组下标越界检查. 将动态数组封装成类的知识点中封装的ArrayOfPoints也提供了类似功能,但只适用于一 ...

  6. 软件工程线上课程(C语言实践篇)学习心得总结

    林牧 + 原创作品转载请注明出处 + <软件工程(C编码实践篇)>MOOC课程http://mooc.study.163.com/course/USTC-1000002006 软件工程的理 ...

  7. C语言程序设计基础-第1周作业-初步

    1.安装带有计算机术语的翻译软件 2.在自己电脑上安装C编译器,windows系统建议安装dev-c++,其他系统自行查找. 3.加入课程小组,有任何疑问可以在小组中提问:https://group. ...

  8. 欢迎参加MVP主讲的Windows 10开发线上课程

    博客地址:http://blog.csdn.net/FoxDave Windows 10 Developer Readiness - Powered by MVPs - 由微软最有价值专家(MVP)主 ...

  9. C语言程序设计基础知识点概括

    C语言程序设计基础知识点概括 C语言程序设计基础知识点1.函数是C语言的基本构成单位.main函数是C语言程序的唯一入口.2.C语言程序开发过程. 编译过程:将以.c或.cpp结尾的源程序文件经过编译 ...

随机推荐

  1. Oracle的sql语句的两种判断形式

    Oracle的sql语句的两种判断形式 判断当前列同时改动当前列 判断一个情况改动其他值 一类情况详解:实现的是当num这一列的值为3时,就显示好 以此类推 1)case num when 3 the ...

  2. June 01st 2017 Week 22nd Thursday

    Do what you say, say what you do. 做你说过的,说你能做的. Do what I have said, live up to my promise, answer th ...

  3. Jmeter入门1 官网下载及安装

    1  Jmeter运行需要java环境.首先需要安装JDK. 图标是这样的:  2 下载apache-jmeter包. jmeter官网:http://jmeter.apache.org/ 3  解压 ...

  4. 漫谈C++:良好的编程习惯与编程要点(转载)

    这个博主写的文章真是细腻,全面,严谨,应当多读几回 原文http://www.cnblogs.com/QG-whz/p/5517643.html 阅读目录 以良好的方式编写C++ class Clas ...

  5. POJ-2976 Dropping tests---二分最大化平均值

    题目链接: https://cn.vjudge.net/problem/POJ-2976 题目大意: 给定n个二元组(a,b),扔掉k个二元组,使得剩下的a元素之和与b元素之和的比率最大 解题思路: ...

  6. Android进阶笔记13:ListView篇之ListView刷新显示(全局 和 局部)

    一.ListView内容变化后,动态刷新的步骤(全局刷新): (1)更新适配器Adapter数据源:(不要使用匿名内部类) (2)调用适配器Adapter的刷新方法notifyDataSetChang ...

  7. Sublime Text 插件 【转】

    好厉害,好漂亮. http://www.cnsecer.com/460.html 安装Sublime Text 3插件的方法: 朋友们,小站活着不容易,全靠广告费养着了,如果本文对你有帮助.麻烦动下手 ...

  8. 【[SDOI2013]随机数生成器】

    题目 来画柿子吧 我们要求的是 \[f(x)\equiv t(mod\ \ p)\] 其中\(f(1)=x_0,f(x)=af(x-1)+b\) 我们来写几项柿子看看 \[f(1)=x_0\] \[f ...

  9. vue中a的href写法

    注意点:href前面要加“:”或者v-bind: 2.字符串要用单引号“ ’ ”包住 加上了冒号是为了动态绑定数据,等号后面可以写变量. 如果不使用冒号,等号后面就可以写字符串等原始类型数据.这是就无 ...

  10. HDU 1159 Common Subsequence(裸LCS)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1159 Common Subsequence Time Limit: 2000/1000 MS (Jav ...