前一段时间忙着赶项目进度,现在就接着之前学习的内容继续学习。
1、c++的内置类型(数字和字符等),体现了大多数计算机硬件本身具备的能力。
2、位于头文件中的代码一般不用using进行声明,因为头文件的内容会拷贝到所有引用它的文件中去。
3、关于直接初始化和拷贝初始化:
拷贝初始化:使用等号进行初始化即为拷贝初始化,例如:string s5 = "everyone can be a better man ";
直接初始化:不使用等号进行初始化即为直接初始化,例如:string s5("everyone can be a better man");
建议使用的时候尽量使用直接初始化,因为拷贝初始化会创建一个临时对象。
4、使用cin>>对string对象执行读取操作时,会自动忽略遇到的空白(空格符、换行符、制表符)并从第一个真正的的字符开始读起,直到遇见下一处空白。:
//example
int main()
{
string s;
cin>>s;
cout << s << endl ;//如果程序输入的是"hello word!"输出为"hello"
return 0;
}
5、使用getline读取输入:getline函数的参数是一个输入流和一个string对象,函数从给定的输入流中读取内容直到遇到换行符为止。
int main()
{
string line;
while (getline(cin,line))
cout << line << endl;
return 0;
}
6、string::size_type类型:string对象包含的字符个数,他是一个无符号类型的值能够存放下任何string对象的大小。
7、如果一条表达式中已经有在用.size()函数了,就不要使用int了。避免混用int和unsigned。
8、关于两个string对象的对比:
- 如果两个string对象的长度不同,而且较短的string对象的每个字符都与较长string对象对应位置的字符相同,那么就说较短的string对象小于较长的对象。
- 如果两个string对象对应位置的字符都不相同,则比较第一对相异字符。
9、当把string对象和字符字面值混在一条语句中使用时,要确保+号的两边至少有一个是string对象。
10、cctypet头文件中用来处理string对象的方法:
11、c++在引用c中的头文件时将.h去掉,再在前面加上c。例如:ctype.h->cctype。
12、使用范围for循环可以遍历string对象中的每一个元素。如果想改变string中的元素要把循环变量定义成引用类型。
//example
string str("some string");
for (auto c:str)
cout << c << endl;
13、string对象可以使用下标运算符遍历其中的每一个元素[i],使用时务必确保下标的有效。
//使用下标遍历string对象中元素
string s("everyone can be a better one");
for(int i =0;i<(s.size()-1);i++)
{
cout << s[i];//可以实现输出string中的每一个元素
}
14、vector可以容纳绝大多数类型的对象作为其元素,但是不能为引用(引用不是对象没有分配内存)
15、c++提供的几种初始化方式:
(1)、拷贝初始化;(2)、类内初始化;(3)、列表初始化。
16、如果循环体内有向vector对象添加元素的语句,不能使用范围for循环。
17、要使用vector的size_type,需首先定义它是由那种类型定义的。
//example
vector <int>::size_type;
18、有关数组:
(1)数组的维数编译的时候应该是一个常数,函数内部定义数组默认初始化会使他含有未定义的值。
(2)初始化字符数组要考虑最有一个是'\0'
(3)数组不支持用另外一个数组拷贝和赋值
//关于复杂数组的声明(从右向左结合)
int *ptrs[10];//一个包含10个整形指针的数组
int &refs[10];//错误:不存在包含引用的数组(因为引用不是对象)
int (*parray)[10]; //指向数组的指针
int (&refs)[10];//指向数组的引用
19、使用auto和decltype对数组操作返回的对象不同。
int ia [] = {3,3,3,3,33};
auto ia2(ia) ; //返回指向第一个元素的指针
decltype(ia) ia3;//返回一个数组
20、数组的begin和end(基于c++11标准)
//基于c++11
int ia [] = {2,2,2,2,2};
int *beg = begin(ia);
int * end = end(ia);
21、只要指针指向数组中的元素就可以执行下标运算访问元素,内置类型下标运算所用的索引值不是无符号类型的。
22、c风格字符串以'\0'结尾,使用数组时真正用的是指向数组首元素的的指针。
23、指针没有定义加法运算,减法限于指向同一个数组
24、可以使用数组初始化vector
int int_arr[]={2,3,4,5,6,7};
vector<int>ivec(begin(int_arr),end(int_arr));
25、多维数组:
constexpr size_t rowCnt = 3, colCnt =4;
int ia[rowCnt][colCnt];
size_t cnt =0;
for (auto &row:ia)
for(auto & col:row)
{
col = cnt;
++cnt;
}
//使用范围for循环处理多维数组时,除了最内层的循环外,替他循环的控制变量都应该是引用类型
26、缓冲区溢出:越界访问引起的错误。