《C++ Primer》学习笔记【第一部分 C++基础】
第2章
整型的赋值:当我们试着把一个超出其范围的值赋给一个指定类型的对象时,结果如何?答案取决于类型是signed还是unsigned的。对于unsigned,编译器会将该值对unsigned类型的可能取值数目求模然后取所得值;对于signed类型,未定义行为,很多处理器处理方式和unsigned类似。
字符串字面值的连接:std::cout << "multi-line" L"literal " << std::endl;结果未定义,即连接不同类型的行为标准未定义。
const:全局作用域声明的const对象默认为文件的局部变量,非const变量默认为extern,要使const变量能够在其他文件访问,必须显示指定为extern。
顶层const,规定某对象的值不能变;底层const,类型如果由底层常量定义,则不能忽略。
引用:一般引用为左值引用,即只能绑定到对象上。const引用可以绑定到非常量的对象或一般表达式。右值引用必须绑定到右值表达式。
double d = 1.0;
const int &x = d;//ok
const int &y = 4; //ok
int &z = 4;//error
int &&zz = 4;//右值引用,ok
指向指针的引用:int *p; int *&r = p;//从右往左读,r是一个引用,引用一个指针,这个指针指向int
类型别名:typedef
注意,typedef char *pstring; const pstring cstr = 0;const pstring是一个指向char的常量指针。
头文件:头文件用于声明而不是用于定义,但有三个例外:1.可以定义类 2.可以定义const对象 3.可以定义inline函数。
(在头文件中加入或修改内联函数时,使用了该头文件的所有源文件都必须重新编译)
auto说明符:auto定义的变量必须有初始值,由编译器通过初始值来推断类型。一条声明语句中,只能有一个基本类型。
auto i = 0, *p = &i;//ok
auto sz = 0, pi = 3.14;//error, 类型不同
第3章
命名空间的using声明:有一种情况下,必须总是使用完全限定的标准库名字:在头文件中。即头文件中,不该用“using namespace std; cout << endl; ”,而该用"std::cout << std::endl;"
理由是头文件的内容会被预处理器复制到程序中,会造成包含该头文件的每个程序中都放置了同一using声明,不论该程序是否需要using声明。
:: operator操作符 : 作用域操作符。在其左操作数的作用域内找到其右操作数的名字。用于访问某个命名空间的名字,如std::cout,同样地,可用于从某个类取名字,如string::size_type。
指针和const限定符:
const int a 等价于int const a。
const int *p 等价于 int const *p, 表示一个指针,指向int类型的const对象。
int * const p表示一个const指针
多维数组和引用,指针
int ia[3][4];
int (&row)[4] = ia[1];//即*(ia+1)
int (*p)[4] = ia+1;//从右往左读,p是一个指针,指向一个维度是4的数组,数组的元素类型是int型。
*(*p+2) = 233;//ia[1][2] = 233
用typedef简化指向多维数组的指针:
typedef int int_array[4];
int_array *ip = ia;
第6章
使用预处理器进行调试
#ifndef NDEBUG
...
#endif
预处理器还定义了其余4种在调试时非常有用的常量
__FILE__:文件名
__LINE__:当前行号
__TIME__:文件被编译的时间
__DATE__:文件被编译的日期
另一个常见的调试技术是使用NDEBUG预处理变量以及assert断言预处理宏,assert宏在cassert头文件中定义,只要NDEBUG未定义,assert就求解表达式,为false时终止程序。
引用形参:应该将不需要修改的引用形参定义为const引用。普通的非const引用形参在使用时不灵活,这样的形参既不能用const对象初始化,也不能用字面值或产生右值的表达式初始化。
通过引用传递数组:f(int (&arr)[10]) //OK, 是维度为10的int数组的引用
f(int &arr[10]) //error
多维数组的传递:int *arr[10]; //维度为10的int型指针数组
int(*arr)[10];//arr是一个指针,指向维度为10的int型数组
函数声明
在头文件中提供函数声明,定义函数的源文件应包含该函数的声明。函数声明中的形参名会被忽略。既可以在声明中也可以在定义中指定默认形参,但一个文件中只能为一个形参指定默认实参一次。
类的成员函数:含有额外的、隐含的形参; const成员函数使隐含的this形参改为const类型, 即不能修改this的数据成员; const对象、指向const对象的指针或引用只能调用其const成员函数。
函数指针:bool (*pf) (const string &, const string &);//pf是一个指向函数的指针,该函数带两个const string&类型的形参和bool类型的返回值。
用typedef简化函数指针的定义, typedef bool (*cmpFcn) (const string &, const string &);
bool lengthCompare(const string &, const string &);
cmpFcn pf1 = lengthCompare;
lengthCompare("hi", "bye");
pf1("hi", "bye"); //ok
(*pf1)("hi", "bye"); //ok
指向重载函数的指针:.....(此坑待填)
第7章 类
编译器只会自动地执行一步类型转换,使用多于一步类型转换总是错误的,我们必须显式完成某一步转换。
explicit:修饰只含一个实参的构造函数,它将以直接初始化的形式使用,而且编译器不会在自动转换过程中使用该构造函数。
标准库中接受一个参数的const char*的string构造函数不是explicit的,接受一个容量参数的vector构造函数是explicit的。
《C++ Primer》学习笔记【第一部分 C++基础】的更多相关文章
- C++学习笔记第一天:基础
前言 N年前学的C,经过VB.JAVA.JS.C#等后辈的轮番蹂躏,当初学的那点儿东西早就还给老师了 现在有了在桌面端实现 Native + Web 的初衷,需要利用CEF开源组件来封装这个Nativ ...
- oracle学习笔记第一天
oracle学习笔记第一天 --oracle学习的第一天 --一.几个基础的关键字 1.select select (挑选) 挑选出显示的--列--(可以多列,用“,”隔开,*表示所有列),为一条 ...
- Linux 学习笔记之超详细基础linux命令 Part 14
Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 13---------------- ...
- Linux 学习笔记之超详细基础linux命令 Part 13
Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 12---------------- ...
- Linux 学习笔记之超详细基础linux命令 Part 12
Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 11---------------- ...
- Linux 学习笔记之超详细基础linux命令 Part 8
Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 7----------------- ...
- Linux 学习笔记之超详细基础linux命令 Part 6
Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 5----------------- ...
- Linux 学习笔记之超详细基础linux命令 Part 5
Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 4----------------- ...
- Linux 学习笔记之超详细基础linux命令 Part 4
Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 3----------------- ...
- Linux 学习笔记之超详细基础linux命令 Part 2
Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 1----------------- ...
随机推荐
- 使用JFinal的第一个项目出现的问题(The return type is incompatible with JspSourceDependent.getDependants())
四月 08, 2016 4:35:34 下午 org.apache.catalina.core.ApplicationDispatcher invoke严重: Servlet.service() fo ...
- (转)学习使用Jmeter做压力测试(一)--压力测试基本概念
一.性能测试的概念 性能测试是通过自动化的测试工具模拟多种正常峰值及异常负载条件来对系统的各项性能指标进行测试.负载测试和压力测试都属于性能测试,两者可以结合进行. 通过负载测试,确定在各种工作负载下 ...
- WebAPI使用多个xml文件生成帮助文档
一.前言 上篇有提到在WebAPI项目内,通过在Nuget里安装(Microsoft.AspNet.WebApi.HelpPage)可以根据注释生成帮助文档,查看代码实现会发现是基于解析项目生成的xm ...
- html a标签包含a标签,浏览器的行为处理
a标签包含a标签 浏览器可能是为了避免a的转跳重复,所以禁止了a标签包含a标签,如何你的代码中有a标签包含a标签,那么浏览器将会重新编码外层a标签,取外层a标签与内层a标签的差集,加上外层a标签,并把 ...
- c#的逻辑运算符重载
不光是C++,实际上C#中同样可以对操作符重载.如:namespace Com.EVSoft.Math{ public class Vector3:BaseObject { ... . ...
- java代码优化
优化通常包含两方面的内容:减小代码的体积,提高代码的运行效率. 1.尽量指定类的final修饰符 带有final修饰符的类是不可派生的.在Java核心API中,有许多应用final的例子,例如java ...
- Devexpress -换皮肤
一.在项目下新建RibbonForm 命名为:useSkin 二.添加引用DevExpress.OfficeSkins DevExpress.UserSkins.BonusSkins 三. ...
- java第三次作业
import java.util.Scanner; public class Practice { public static void main(String[] args) { int nextV ...
- python核心编程学习记录之执行环境
- Dynamics AX 2012 R2 窗体系列 - 在窗体上修改字段时所触发的方法及其顺序
在这个系列里,Reinhard将和大家一起探索在AX的窗体上执行操作时,都会触发窗体.窗体数据源和表上的哪些方法,并且是以怎样的顺序触发的. 这次,我们来看看在窗体上修改或录入数据的情 ...