c++
1、c++如何确定常量的类型
假设在程序中使用常量来表示一个数字: cout<<"Year"<<1492<<endl; 那么程序会把1492存成什么类型呢?答案是,除非有理由存储为其他类型(如使用了特殊的后缀来表示特定的类型,或者值太大,不能存储为int),否则c++将整形常量存储为int类型。
2、c++11中auto的声明
在初始化过声明中,如果使用auto,而不指定变量的类型,编译器将把变量的类型设置成初始值相同:auto n = 100; //n为 int。
对于复杂类型,如标准模板库(STL)中的类型时,自动类型推断的有时才能显现出来,例如对于下面的c++98代码:
std : : vector<double> score;
std : : vector<double>::iterator pv = score.begin();
c++11允许这样做
std : : vector<double> score;
auto pv = score.begin();
3、c++11数组初始化方法
(1)、初始化数组时,可省略等号(=)
double arr[10] {1.0,2.0,4.3 };
(2)、可以不再大括号内包含任何东西,这将把所有元素都设置为0
int arr[10] { }; // 数组中元素都为0
(3)、列表初始化的时候禁止缩窄转换
long int arr[10] {24,89,8.9}; //不允许,因为将浮点数转换成整形是缩窄转换
char arr[10] {'h','i',17777777,'\0'}; //不允许,因为17777777超过了char类型的取值范围
char arr[20] {'j','i',122,'\0'}; //允许,虽然122是整形,但是它在 char变量的取值范围内
(4)、同样的,对于结构体也适用。
4、看一段程序
int main()
{
char arr[20];
cout<<strlen(arr)<<endl; //未初始化的数组的内容是未定义的,函数strlen从数组的第一个元素开始计算字节数,直到空字符。因此这个值是未知的。
}
5、不要尝试释放已经释放的内存块,c++11规定,这样做的结果是不确定的,这意味着什么情况都可能发生。
6、不能用delete来释放new分配的内存,然而对空指针使用delete是安全的。
7、静态联编:在编译时分配内存;动态联编:在程序运行时创建。
8、new的空间必须用delete来释放,new [ ] 的空间必须用delete [ ] 来释放;如果不匹配,导致的后果是不确定的。
9、c++管理内存的方式:1、自动存储:自动变量(局部变量)通常存储在栈中。2、静态存储:一种是在函数外面定义,一种是在声明变量时使用关键字static 。 3、动态存储:在堆(或者成为自由存储区)上存储(使用new、malloc等函数)。4、线程存储(c++11)让程序放在可并行处理的不同线程中,使用关键字thread_local声明,声明周期与所属的线程一样长。
10、数组的替代品:1、vector,它使用new和delete管理内存。vector<typeName> vt(n_elem) 创建一个名为vt的vector对象,它可以存储n_elem个类型为typeName的元素,其中n_elem可以是整形常量,也可以是整形变量。2、模板类array,他的长度是固定的,使用栈(静态内存分配),而不是自由存储区,因此效率与数组相同,比vector效率高。array<typeName,n_elem> arr; 其中n_elem必须是常量。
11、++i 和 i++区别:前缀++:将值加1,然后返回结果;但后缀版本首先复制一个副本,将其加1,然后将复制的副本返回。因此前缀版本的效率比后缀版本高。
12、逗号表达式从左往右计算,但是最后一个表达式的值是整个表达式的值。
13、范围for对数组(或者容器类,如vector和array)的每个元素执行相同的操作。
int arr[5] = {1,2,3,4,5};
for(int x : arr)
cout<<x<<endl;
可以循环遍历数组中的每一个元素
for(int &x : arr)
x = x*2; //可以实际的操作数组中的元素
14、cin会忽略空格和换行符;发送给cin的输入被缓存,意味着只有用户按下回车键后,键入的内容才会被发送给程序。
15、区分cin.get(ch) 和 cin.get()
属性 | cin.get(ch) | cin.get() |
传递输入字符的方式 | 赋值给参数ch | 将函数返回值赋值给ch |
用于字符输入时函数的返回值 |
istream对象(执行bool转换为true) | int类型的字符编码 |
到达EOF时函数的返回值 | istream对象(执行bool转换后为false) | EOF |
16、简单区别:
- cin>>ch; //读取输入的字符,但是它将忽略空格、换行符、制表符
- cin.get(ch); //不管输入的字符是什么都会存储到ch中
- ch = cin.get(); //返回下一个输入的字符(包括空格、换行符、指表符)
- cin.get(char)成员函数调用通过返回转换为false的bool值来指出已到达EOF,而cin.get()成员函数调用通过返回EOF来指出已到达EOF,EOF是在文件iostream中定义的。
17、cctype中的字符函数
isalunm() | 如果参数是字母或者数字,该函数返回true |
isalpha() | 如果参数是字母,该函数返回true |
isdigit() | 如果参数是数字(0-9),该函数返回true |
islower() | 如果参数是小写字母,该函数返回true |
isspace() | 如果参数是标准空白字符,如空格、进纸、换行符、回车、制表符、该函数返回true |
isupper() | 如果参数是大写字母,该函数返回true |
isxdigit() | 如果参数是16进制数字(0-9、a-f、A-F),该函数返回true |
tolower() | 如果参数是大写字符,则转成小写,否则返回该参数 |
toupper() | 如果参数是小写字符,则返回其大写,否则返回该参数 |
iscntrl() | 如果参数是控制字符,该函数返回true |