C++随记(0x02)1
一、string 类
char chs[20];
cin.getline(chs,20);
这种句点表示法表明 getline()
是istream类的一个类方法(cin是istream的类对象),使用 getline()
可以避免越过数组边界。
string str;
getline(cin,str);
这里对 string
对象没有使用句点表示法,说明 getline()
不是类方法,string
对象是可变大小的,不需要限定边界。
小知识:
为什么前一个 getline() 是类方法,另一个不是呢?
因为在引入 string 类前,C++早有 istream 类,因此 istream 设计时考虑到了 double 、int 和其他基本类型的类方法,但是没有处理 string 对象的类方法,所以只能另外设计一个 getline() 函数来处理 string 对象。
cin >> chs;
cin >> str;
但 cin
还是可以处理 string
对象,是因为处理 string
对象的代码使用 string
类的一个友元函数。
二、字符串字面值
如果要输出以下这句话
Jim "King" Tutt uses "\n" instead of endl.
使用标准字符串字面值,需要编写如下
cout << "Jim \"King\" Tutt uses \"\\n\" instead of endl." << endl;
这种方法需要多个转义符,很是麻烦,C++11新增了原始字符串类型(在原始字符串中,字符表示的就是自己),上述输出可编写为
cout << R"(Jim "King" Tutt uses "\n" instead of endl.)" << endl;
若原始字符中带有 "(
和 )"
,那咋办?
可以使用自定义定界符(在默认定界符之间添加 任意数量 的基本字符,但空格 、左右括号、斜杠和控制字符(如制表符和换行符)除外)来代替默认界定符,如:
cout << R"+-(please call me "(liangzai)")+-" << endl;
//输出
please call me "(liangzai)"
是不是很方便啊
三、OOP介绍
面向对象编程与传统的过程性编程的区别在于:OOP强调的是在运行阶段进行决策,而面向过程则是在编译阶段进行决策。
运行阶段决策就好比在度假时,选择参观那些景点取决于当时的天气和心情;编译阶段决策更像在不管什么条件下,都坚持预先设定好的行程安排。
运行阶段决策提供了灵活性,例如为数组分配内存时,数组的长度在编译时就已经决定好了。
如:给数组分配200个元素,在80%的情况下只需用到100个元素,那程序在大多数情况下都是浪费了内存。而OOP通过将这些决策推迟到运行阶段,在运行时,可以这次告诉它只需100个元素,而下次还可以告诉它需要200个元素。
参考自《C++ Primer Plus》 ↩︎