P82
在字符串里不能有“真正的”换行;
为了使程序比较整洁,可以将长字符串用空白(换行符、制表符)断开,编译器将拼接起连续的字符串~
#include <iostream> using namespace std; int main ( ) { /*********************** 错误例子 ***************************/ char wa[] = "abcd efgh wxyz"; cout << wa << endl; /*********************** 正确例子 ***************************/ char alpha[] = "abcd" "efgh" "ijklmn" "opqrstuvwxyz"; cout << alpha << endl; }
P85
关键字const可以加到一个对象的声明上,将这个对象声明为一个常量。因为不允许赋值,常量在声明时就必须初始化。
注意:const实际上改变了类型,也就是说,它限制了对象能够使用的方式。
#include <iostream> using namespace std; int main ( ) { /*********************** 错误例子 ***************************/ const double pi; pi = 3.14; cout << pi << endl; /*********************** 正确例子 ***************************/ const int maxn = 888; cout << maxn << endl; }
P87
指针常量 与 常量指针 (xx书的shit一样的中文翻译)
技巧:从右往左读。
char *const cp; //cp is a const pointer to char char const* pc; //pc is a pointer to char const const char* pc2; //pc2 is a pointer to char const
cp是一个const pointer;
pc和pc2都是指向char const的普通指针,这两个没有区别。
下面是书中的一个例子,注释稍加修改:
void f1(char* p) { char s[] = "Gorm"; const char* pc = s; //pc指向const pc[3] = 'g'; //错误:pc是指向的char是常量 pc = p; //ok char *const cp = s; //cp是const指针 cp[3] = 'a'; //ok cp = p; //错误:cp是const const char *const cpc = s; //到const的const指针 cpc[3] = 'a'; //错误:cpc指向const cpc = p; //错误:cpc本身是const }
可以将一个变量的地址赋给一个指向常量的指针,因为这样做不会造成任何伤害。
当然,不能将常量的地址赋值给一个未加限制的指针,因为这样做将会允许修改该对象的值了。例如:
void f4() { int a = 1; const int c = 2; const int* p1 = &c; //ok const int* p2 = &a; //ok int* p3 = &c; //错误:用const int*对int* 进行初始化 *p3 = 7; //试图修改c的值 }
P88
一个引用就是某对象的另一个名字。引用的主要用途是为了描述函数的参数和返回值,特别是为了运算符的重载。
为了确保一个引用总能约束到某个对象,规定必须对引用做初始化
int ii = 0; int& r1 = ii; //正确 int& r2; //错误:没有初始化
引用还可以用于定义一些函数,试它们既可以被用在赋值的左边,也可以用在赋值的右边。。(意思是函数的返回值是引用)
例子:
#include <iostream> #include <string> #include <vector> using namespace std; struct Pair { string name; double val; }; vector<Pair> pairs; //维护Pair的一个集合 //检索s,如果找到就返回其值;否则做一个新Pair并返回默认值0 double& value(const string& s) { for(int i = 0; i < pairs.size(); ++i ) if(s == pairs[i].name) return pairs[i].val; Pair p = { s, 0 }; pairs.push_back(p); return pairs[pairs.size()-1].val; } int main ( ) { string buf; while(cin >> buf) value(buf)++; for(vector<Pair>::const_iterator p = pairs.begin(); p != pairs.end(); ++p) cout << p->name << ": " << p->val << ' '; }
P92
结构体
数组是相同类型的元素的一个聚集。一个struct则是任意类型元素的一个聚集。
定义struct类型时,请注意最后的分号。。。
用于对数组初始化的形式也适用于初始化结构体类型的变量~
#include <iostream> using namespace std; struct address { char* name; int number; char* street; char* town; char state[2]; int zip; }; int main ( ) { address jd = { "Jim Dandy", 61, "South St", "New Provience", { 'N', 'J' }, 7974 }; }