=======================================================================
day05
=======================================================================
1.当我们的类没有显式地定义一个构造函数时,编译器就会为我们隐式地定义一个默认构造函数,又称为【合成的默认构造函数】。默认构造函数又叫零参数构造函数,当我们显式定义了其他构造函数,编译器就不会生成默认的构造函数了。
因为定义在块内的内置类型或复合类型被默认初始化会得到未定义的值,所以,如果类包含内置类型或者复合类型的成员,【只有这些成员全部被赋予了类内初始值,才适合使用编译器合成的默认构造函数】,否则用户在创建类的对象时就可能得到未定义的值。
有时候,我们既需要其他形式的构造函数,也需要合成的默认构造函数,那么可以通过在参数列表后面写上 【 = default】来要求编译器生成构造函数。
eg: Sales_data() = default; // 注意,其等价于 Sales_data(){}
2.public成员定义类的接口,private部分封装(隐藏)了类的实现细节。
3.友元函数,必须声明在类的内部,public、private等访问说明符对它不起作用。声明为友元就可以访问类的非公有成员了。【由于友元声明仅仅指定了访问权限,并非一个通常意义上的函数声明】所以,我们必须在友元声明之外再专门对函数进行一次声明。
eg: class A{
friend A func(parameter);
}
A func(parameter);
类还可以把其他类定义为友元,如果一个类指定了友元类,则友元类的成员函数可以访问此类包括非公有成员在内的所有成员。注意,友元关系不存在传递性。
除了把整个类作为友元外,还可以只令类的某个函数成为友元。
eg: class A{
friend void B::clear();
}
class B{
void clear();
}

4.定义在类内的函数自动内联。我们也可以在用inline关键字显式地内联。在声明和定义处都可以用incline设置内联,但最好只在类外部定义的地方说明inline。
5.我们知道,类的数据成员的类内初始值用=初始化,
但当我们要初始化的成员是另一个类的对象时,应该用{} // p.246
6.类的常量对象只能调用类的const成员函数,而类的非常量对象即可调用const函数,也可以调用非常量函数,
但显然此时调用非常量版本是一个更好的匹配。我们可以这样做:
class Screen{
public:
// 根据对象是否为const重载了display函数
Screen &display(std::ostream &os) {do_display(os);return *this;}
const Screen &display(std::ostream &os) const {do_display(os);return *this;}
private:
//该函数负责显示Screen的内容
void do_dispaly(std::ostream &os) const {os<<contents;}
//数据成员
string contents;
}
当display调用do_display时,它的this指针隐式地传递给do_display。
当display的非常量版本调用do_display时,它的this指针将隐式地从指向非常量的指针转换成指向常量的指针。
当do_display完成后,display函数各自返回解引用this所得的对象。在非常量版本中,this指向一个非常量对象,因此display返回一个普通(既非常量)引用,相反,const对象则返回一个常量引用。
对象是否为const决定了应该调用display的哪个版本:
Screen myScreen(5,3);
const Screen blank(5,3);
myScreen.display(cout); // 调用非常量版本
blank.display(cout); // 调用常量版本
===================================================================
7.不完全类型。指已经声明,但未定义的类型。
不完全类型只能在非常有限的场景下使用:可以定义指向这种类型的指针或引用。也可以声明(但不能定义)以不完全类型作为参数或者返回类型的函数。
class Link{
Link *next;
Link *prev;
}
8.交换两个数可以这样做:
a ^= b;
b ^= a;
a ^= b;
9.名字查找与类的作用域。建议查看p254-p257
类的定义分为两步处理:
(1)首先,编译成员的声明。
(2)直到类全部可见后才编译函数体。
举个例子:
typedef double Money;
string bal;
class Account{
public:
Money balance() {return bal;}
private:
Money bal;
}
当编译器看到balance函数的声明语句时,它将在Account类的范围中寻找对Money的声明,而且编译器只考虑类Account中使用Money前出现的声明,如果没有找到,就会到类Account的外层作用域寻找Money的声明,这时,编译器会找到Money的typedef语句。该类型被用于函数的返回类型和数据成员bal的类型。另一方面,由于函数体直到类全部可见之后才会被编译处理,所以balance函数体的return语句返回名为bal的成员,而非外层作用域的string对象。

C++Primer笔记-----day05的更多相关文章

  1. C++ Primer笔记

    C++ Primer笔记 ch2 变量和基本类型 声明 extern int i; extern int i = 3.14;//定义 左值引用(绑定零一变量初始值,别名) 不能定义引用的引用:引用必须 ...

  2. C++ Primer 笔记(1)基础中的战斗机 输入输出 对输入不定数据处理

    今天打算再重新好好的看一遍C++ Primer这本很经典的书籍,笔记开始: 1.每个C++程序都包含一个或者多个函数,其中必须有一个main,操作系统通过调用main入手运行程序: 2.函数包括:返回 ...

  3. C++ Primer 笔记 第一章

    C++ Primer 学习笔记 第一章 快速入门 1.1 main函数 系统通过调用main函数来执行程序,并通过main函数的返回值确定程序是否成功执行完毕.通常返回0值表明程序成功执行完毕: ma ...

  4. C++primer笔记之顺序容器

    最近又重新拾起C++primer,发现每一次看都会有不同的体验,但每一次看后因为不常用,忘记得很快,所以记笔记是很关键的一环,咋一看是浪费时间,实际上是节省了很多时间.下面就把这一节的内容做一个简单的 ...

  5. c++ primer 笔记 (一)

    昨天开始看的<C++ Primer>,确实不错.希望这周抓紧看完,每天做下笔记,以便以后复习. main函数返回一个值给操作系统   操作系统通过main函数返回的值来确定程序是否成功执行 ...

  6. C++ Primer笔记(1)——连续读取数据、类型对应的尺寸、类型转换、字符串分行写法

    这次要看看C++ Primer,这本基本上就是必读书籍了.下面的内容就是一些之前没有学过的知识的笔记. 读取数量不定的输入数据 虽然很简单,但是还是记一下: #include <iostream ...

  7. C++Primer笔记(3)

    标准库类型string表示可变长的字符序列,使用前先包含string头文件.(哈哈,终于可以逃脱C语言中的str函数系列了.)因为是标准库的一部分,所以string被定义在命名空间std中.所以你懂该 ...

  8. C++ Primer 笔记 第三章

    C++ Primer 第三章 标准库类型 3.1using声明 例: using namespace atd; using std::cin; 3.2string类型 初始化方式 string s1 ...

  9. C++ Primer 笔记 第二章

    C++ Primer 第二章 变量和基本类型 2.1基本内置类型 有算数类型和void类型:算数类型储存空间大小依及其而定. 算数类型表: 类型 含义 最小储存空间 bool 布尔型 - char 字 ...

随机推荐

  1. Codeforces 808G Anthem of Berland【KMP】【DP】

    LINK 简要题意 给你一个串s,上面有字母和一些通配符,问你将通配符换成字母之后最多可以出现多少次串t 首先有一个很傻子的做法就是\(dp_{i,j}\)表示s到第i个位置匹配t串前j个字符的完整t ...

  2. 关于Mybatis将查询结果中添加常量列并返回

    引言 在使用mybatis的时候,查询一个集合返回给前台页面,在有的时候,我们会添加一个常量字段到对象或者集合中,来标识这个对象属于的类型等等情况,当前台进行再次请求的时候携带此变量进行请求. 但是: ...

  3. 《DSP using MATLAB》示例Example7.8

    窗函数的设计思想就是选择一个理想的频率选择滤波器(通常其脉冲响应函数是 非因果.无限长的),然后截断(取窗)这个无限长脉冲响应,得到一个线性相位.因果的 FIR滤波器.频率域示意图如下: 我们的目的: ...

  4. Mysql中五级权限小结

    mysql的权限控制主要是通过mysql库下的db,user,host,table_priv,column_priv表控制. 由于权限信息数据量比较小,所以mysql在启动时会将所有的权限消息加载到内 ...

  5. 多文件的Makefile

    Linux下编写一般采用gcc编译工具,但gcc无法满足大量的文件同时编译,这是就用到Makefile,首先先介绍一下gcc GCC编译的四个步骤 1.预处理,生成预编译文件(.文件): Gcc –E ...

  6. npm dose not support Node.js v10.15.3

    事件起因: 楼主在vue-cli官网,尝试使用vue-cli3脚手架+yarn包管理器构建项目时,命令行窗口提示node版本不对.如下图 这个大家都知道该如何去解决,直接去node官网下载符合版本的n ...

  7. (转)Android studio 使用心得(五)—代码混淆和破解apk

    这篇文章等是跟大家分享一在Android studio 进行代码混淆配置.之前大家在eclipse上也弄过代码混淆配置,其实一样,大家可以把之前在eclipse上的配置文件直接拿过来用.不管是.cfg ...

  8. p2p通信原理及实现(转)

    1.简介 当今互联网到处存在着一些中间件(MIddleBoxes),如NAT和防火墙,导致两个(不在同一内网)中的客户端无法直接通信.这些问题即便是到了IPV6时代也会存在,因为即使不需要NAT,但还 ...

  9. 移动端固定头部和固定左边第一列的实现方案(Vue中实现demo)

    最近移动端做一份报表,需要左右滚动时,固定左边部分:上下滚动时,固定头部部分. 代码在Vue中简单实现 主要思路是: a.左边部分滚动,实时修改右边部分的滚动条高度 b.头部和内容部分都设置固定高度, ...

  10. EF6:编写你自己的code first 数据迁移操作(睡前来一篇,翻译的)

    原英文版由EF团队成员 Rowan Miller 在2013年发表,此处只作翻译备忘. 数据迁移提供了一套强类型API,用于执行通用的操作,比如CreateIndex("dbo.Blogs& ...