实习告一段落,翻开C++primer 准备苦逼的重温C++ 。以下是一些 从书上抄下来的笔记。
测试: -10u 是什么类型?
-10u 类型是unsigned int 使用 typeid(-10u).name() 测试的
变量的初始化:
1、复制初始化: int ival=1024;
2、直接初始化: int ival(1024);
直接初始化语法更灵活且效率更高。
初始化和复制的区别:
初始化是创建变量并给它赋予初始值,而赋值是擦除对象的当前值并用新值代替。
变量的定义和声明:
定义(define): 为变量分配存储空间,还可以为变量指定初始值
声明(declare): 向程序表明变量的类型和名字
可以用extern 关键字声明变量名而不定义。如果声明有初始化式,可被当做定义,即使声明标记为extern。
EX:extern double pi = 3.16
//difinition
注意: 只有当extern 声明位于函数外部时,才可以含有初始化式
原因如下:
1、变量只能定义一次,所以,不关怎样,只能有一个extern int i=1这样的定义;2、extern定义的变量必须是全局的,这样才可能在其他文件中使用,所以,不能再语句块里定义
const 关键字
const对象默认为文件的局部变量。
一个非const变量定义在file_1中,如果在file_2 中声明(extern)了,就可以在file_2 中使用。
全局作用域(global scope)声明的const 变量是定义该对象的文件的局部变量,不能被其他文件访问。
可以使用extern修饰const变量,可以在整个程序访问const 对象。EX: extern const int ival = fcn();
结论: 非const 变量默认为extern。要使const变量能在其他的文件中访问,必须显示指定为extern
原因: 在于允许const变量定义在头文件中
const 引用
非const引用只能绑定到与该引用同类型的对象
const 引用则可以绑定到不同当相关的类型的对象或绑定到右值。 EX: double dval=3.14; const int &ri=dval;
typedef
定义类型的同义词:
EX: typeof int integer1;
typeof integer1 integer2;
class 和 struct 关键字定义类的唯一差别就是 默认访问级别: struct 的成员是public , class 的成员为private
头文件包含在多个源文件中,所以不应该含有变量或函数的定义。
3个例外: 1、类的定义;2、const 对象 ;3 、inline 函数
注意:
因为const 对象默认为定义它的文件的局部变量,所以把它们的定义放在头文件是合法的。 当我们在头文件定义了const变量后,每个包含该头文件的源文件都有了自己的const 变量,其名称和值都一样。
如果const变量不是用常量表达式初始化,那么它就不能在头文件中定义。 只能在一个源文件中定义并初始化,然后在头文件中为它添加extern 声明,以使被多个文件共享。(这里还不是很清除,求路过的大爷指教)
预处理器
预处理器变量的名字在程序中必须是惟一的。
(变量经常用大写字母表示)
预处理器变量两种状态: 已定义 或 未定义
#define 指示接受一个名字并定义该名字为预处理器变量
#ifndef 指示检测指定的预处理器变量是否未定义
预防多次包含同一个头文件:
#ifndef SALESITEM_H
#define SALESITEM_H
//Definition of Sales_item calss
#endif
通过使用类名来组成头文件和预处理器变量的名字,可以使得很可能只有一个文件将会使用该预处理器变量。
在头文件中: 必须总是使用完全限定的标准库名字. 原因: 如果头文件中放置using声明,则包含该头文件的每个程序中都放置了同一个using 声明,无论该程序是否需要。
标准库 string 类型
#include <string>
using std::string;
4种默认构造函数:
1) string s1;
2) string s2(s1);
3) string s3("value");
4) string s4(n,'c'); 'c'的n个副本
string的读取:
string str;
cin>>str; 1)读取并忽略开头所遇到的空白字符(空格、换行符、制表符)
2)读取字符直到再次遇到空白字符,读取终止
getline 读取整行文本; getline(输入流,string对象)
getline 函数返回时丢弃换行符,string对象不会存储换行符。
string.size() 字符的个数 : 返回 string:size_type 类型数据,不要用int类型存储。
string 对象字符的处理 cctype 头文件里
isalnum(), isalpha() .....之类的函数。
vector 类型
#include<vector>
uisng std::vector;
vector 对象的定义和初始化4种:
1)vector<T> v1;
2)vector<T> v2(v1);
3)vector<T> v3(n,i) n个值为i 的元素
4)vector<T> v4(n)
vector.size() 元素的个数 : 返回 vector<T>::size_type 类型数据,不要用int类型存储。
EX: vector<int>::size_type; //ok
vector::size_type
//error
解引用操作符(*)
iterator 迭代器:
vector::iterator 解引用时,得到对某个元素的非const引用
vector::const_iterator 解引用时得到一个指向const 对象的引用,不能改变元素的值
对比: const 的 iterator对象,声明一个const迭代器是,
此迭代器指向的元素内容不能修改,迭代器的值本身可以修改。
const_iterator 对象可以用于const vector 或 非const vector ,因为它不能改变元素值。
EX:
const vector<int> nines(10,9);
vector<int>::iterator ct1 = nines.begin();
//error
vector<int>::const_iterator ct1 = nines.begin();
//ok
迭代器的算术运算:
1)iter+/- n ; //n 为 vector的 size_type 或 difference_type 类型
2)iter1 - iter2 ; // difference_type
bitset 类型
#include<bitset>
using std::bitset;
定义 4种:
1) bitset<n> b; // b 有n位,都为0
2) bitset<n> b(u); // b 是 unsigned long 型u 的一个副本
3) bitset<n> b(s); // b 是 string 对象s 中含有的位串的副本
4) bitset<n> b(s,pos,n) // s从pos 开始的n个位的副本
注意: 用string对象初始化bitset 对象是,string对象直接表示为位模式,从string对象读入位集的顺序是从右向左。
bitset.size() 操作返回的类型是 size_t 类型, 定义在 cstddef 头文件中,其大小足以存储内存中对象的大小。