C++Primer (第四版) 重点笔记

第一章 快速入门

P16:不同的操作系统使用不同的值作为文件结束符。Windows系统下我们按Ctrl+z。Unix系统中,包括 Mac OS-X 机器,通常用 Ctrl+D。

P18:标准库的头文件用尖括号 < > 括起来,非标准库的头文件用双引号 " " 括起来。


第二章 变量和基本类型

P32:C++中,把负值赋给 unsigned 对象是完全合法的,其结果是该负数对该类型的取值个数求模后的值。

所以把 -1 赋给 8 位的 unsigned char,那么结果是 255, 因为 255 是  -1 对 256 求模后的值。 


P34:20//decimal十进制

024 //octal 八进制

0x14/0X14 //hexadecimal 十六进制


P36:程序格式化特性:在一行的末尾加一反斜线符号可将此行和下一行当作同一行处理。

std::cout<<"H\
	i"<<std::endl;
//注意:以上代码 不等于 以下代码的书写  ∵i前面有空格输出
std::cout<<"Hi"<<std::endl;

P39:左值 与 右值

左值:左值可以出现在赋值语句的左边或者右边。(左值表示存储在计算机内存的对象,相当于地址值。 可对左值进行读写操作,主要是写操作)

右值:右值只能出现在赋值的右边。(右值代表真实数据,数据值)

int ia, ib;
ib = 0;		//计算机取 0 的右值赋值于 ib 的左值 
ia = ib;	//取 ib 的右值赋给 ia 的左值

P42:初始化 直接初始化 和 复制初始化

int ival(1024);		//direct-initialization
int ival = 1024;	//copy-initialization
初始化指创建变量并给它赋初始值, 而赋值则是擦除对象的当前值并用新值代替。


P44:变量初始化规则 
内置类型变量初始化:取决于变量定义的位置。在函数体外定义的变量初始化成 0 ,在函数体里定义的内置类型变量不进行自动初始化。

类类型变量的初始化:类通过定义一个或多个构造函数来控制类对象的初始化。

std::string global_str;		//global_str = "";
int global_int;				//初始值为 0
int _tmain(int argc, _TCHAR* argv[])
{
	int local_int;			//无初始值
	std::string local_str;	//local_str = "";
	cout<<local_str.c_str(); //(输出 查看有没有空格)
	//. . .
	return 0;
}

P45:声明和定义

变量的定义:用于为变量分配存储空间,还可以为变量指定初始值。(在一个程序中,变量有且只有一个定义)

声明:用于向程序表明变量的类型和名字。

注意:定义也是声明:当定义变量时,我们声明了它的类型和名字。 可以通过使用 extern 关键字声明变量名而不定义它。

extern int i;	//declares but does not define i
int i;			//declares and defines i (global variable)

extern double pi = 3.1416;	//definition
double pi;		//error: redefinition of pi

extern double pi = 3.1416;	//definition
extern double pi;			//ok: declaration not definition
extern double pi = 3.1416;	//error: redefinition of pi

P50:引用   cosnt 引用

引用与指针的区别:

1.引用必须初始化,而指针不必

2.引用初始化后不能修改,指针可以改变其所指向的对象

3. 不存在指向空值的引用,但是存在指向空值的指针

注意:

1.非 const 引用只能绑定到与该引用同类型的对象。

int i = 42;
//legal for const references only
const int &r = 42;   // int &r = 42;
const int &r2 = r + i;
2.const 引用则可以绑定到不同不同但相关的类型的对象或绑定到右值。

double dval = 3.14;
const int &ri = dval;
//编译器会把这些代码转换成如以下形式的编码
int temp = dval;		//create temporary int from the double
const int &ri = temp;	//bind ri to that temporary
/*
如果 ri 不是 const, 那么可以给 ri 赋一新值。 这样做不会修改 dval, 而是修改了 temp.
期望对 ri 的赋值会修改 dval 的程序员会发现 dval 并没有被修改。仅允许 const 引用绑定
到需要临时变量作为媒介来完全绑定过程的值,因为 const 引用是只读的。
*/

P53:typedef 名字

typedef double wages;		//wages is a synonym for double
typedef wages salary;		//indirect synonym for double

wages hourly, weekly;		//double hourly, weekly;
typedef 通常被用于以下三种目的:

1.为了隐藏特定类型的实现,强调使用类型的目的。

2.简化复杂的类型定义,使其更容易理解。

3.允许一种类型用于多个目的,同时使得每次使用该类型的目的明确。


P57: struct 和 class 的区别

用class 和 struct 关键字定义类的唯一差别在于默认访问级别:默认情况下,struct 的成员为 public,而 class 的成员为 private。

 

P61: 避免多重包含

#ifndef __SALESITEM_H__
#define __SALESITEM_H__
// Definition of Sales_item class and related functions goes here
#endif //__SALESITEM_H__

//或者
#pragma once

第三章 标准库类型

P70:

表3-1 几初始化string对象的方式

string s1;                            默认构造函数,s1为空串

string s2(s1);                         将s2初始化为s1的一个副本

string s3(“value”);                 将s3初始化为一个字符串字面值副本

strings4(n, ‘c’);                      将s4初始化为字符 ’c’ 的n个副本


P71:string对象的读写

int main()
{
	string s;
	cin>>s;				//”    Hello World!   ”
	cout<< s <<endl;		//”Hello”
	return 0;
}

@.读取并忽略开头所有的空白字符(如空格,换行,制表符)。

@.读取字符直至再次遇到空白字符,读取终止。


P72:getline读取整行文本

int main()
{
	string line;
	while(getline(cin, line))
		cout<<line<<endl;
	return 0;
}

@.getline并不忽略行开关的换行符。由于getline函数返回时丢弃换行符,换行符将不会存储在string对象中。


表3-2 string操作

s.empty()                 如果s为空串,则返回true,否则返回false

s.size()                   返回s中字符的个数

s[n]                       返回s中位置为n的字符,位置从0开始计数

s1 + s2                   把s1和s2连接成一个新字符串,返回新生成的字符串

s1 = s2                   把s1内容替换成s2的副本

v1 == v2                  比较v1与v2的内容,相等则返回true,否则返回false

!=,<, <=, > 和 >=          保持这些操作符惯有的含义

@.任何存储string的size操作结果的变量必须为string::size_type类型。特别重要的是,不要把size的返回值赋给一个int变量。

string关系操作符

@.如果两个string对象长度不同,且短的string对象与长的string对象的前面部分相匹配,则短的string对象小于长的string对象。

@.如果两个string对象的字符不同,则比较第一个不匹配的字符。


string和字符串字面值的连接

string s1("hello");
string s2("world");
string s3 = s1 + ", ";			//ok: adding a string and a literal
string s4 = "hello" + ", ";		//error: no string operand
string s5 = s1 + ", " + "world";	//ok: each + has string operand
string s6 = "hello" + ", " + s2;	//error: can't add string literals
/*
注:当进行 string 对象和字符串字面值混合连接操作时,
+ 操作符的左右操作数必须至少有一个是 string 类型的
*/







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值