C++基础学习01
Part1:
1.C++中整型有几种?
答:Char \short\ int\ long \long long,每种都有有符号和无符号两种
2.有符号整型和无符号整型有什么区别?
答:以char为例,取值范围分别为:0-255 -128-127
3.char是字符还是数字?
表示和存储的关系,以整数的形式存储,以字符的形式表示,存储时,对照ACSII码表找字符对应的数字存储,显示时找到数字对应的字符并显示
Part2:
1.浮点数类型有几种?
3种:float \double\ long double
1.如何比较两个浮点数的大小?
答:不能直接判断,判断精度范围,两数之差的绝对值是否小于某给定精度
2.浮点数常量默认是什么类型?
答:double,若要定义为float,写为 0.2f
3.科学计数法:2.45e8是多少?
2.45*10^8
4.C++中取模的两个操作数可以是小数吗?
答:一定不能,只能是整数,否则编译报错
5.可以将短类型赋给长类型吗?可以将长类型赋给短类型吗?
前者可以,float=int
后者不行,如int=float, 还有风险,编译不会报错,但是会导致赋值后两者不相等。
6.C++种类型转换用什么符号?
花括号{},且只能从短类型赋给长类型。Long={int}
7.长类型加const后赋值给短类型会有什么情况?
如果长类型的值在短类型范围内,允许。因为常量的值不会再改变
否则,禁止
8.表达式中类型转换的规则是什么?
大多变量(bool char unsigned char short等)转换为Int,整型提升
其他情况,小范围转换为大范围,如Int转换为float
其实两者可归结为一类
9.强制类型转换在C和C++种的写法?
(long) a
Long (a)
字符串:
1.C++的两种字符串类型?有什么异同?
Char *
String
string的好处:string类可以让程序自动处理字符串大小,不用担心读入的字符串超界。
求长度的方法: (char *)-- strlen() (string)--str.size() ,string可用长度函数直接求
IO读入的差别:
Char st[100];
Cin.getline(st,100);
String str;
Getline(cin,str); //不用指定长度,会自动设置长度
2.string的初始化?
String str1={"hello world"};
3.C++ string类型新特性?
原始字符串,即不需要转义字符,可以直接原样输出,格式如下:
R"(I want a "cat")"
结构体:
1.C++中提倡使用内部结构体还是外部结构体?
外部结构体
2.两种结构体初始化方式?
第一种,同C语言;第二种,省略等号,写成列表形式
Student xiaoming {"xiaoming",1,3.5}
3.枚举赋值的两种方式?及具体含义
隐式赋值:enum color {red,white,bule,green}; //默认为0,1,2,3
显式赋值:enum color {red=2,white=5,bule,green};
4.枚举类型怎么用?
Color a=red; //不要乱赋值为没有定义的值
(枚举:声明,使用方法,使用时注意点)
指针:
1.引用和解除引用的符号是?
& *
2.指针输出的是地址,那可否将地址直接赋给指针呢?
不行,因为类型不一致
Int * p;
P=0x12345678; //错
C++中必要要进行类型转换
P=(int *)0x12345678, //但该地址的情况其实我们自己也不清楚,所以最好不要这么干!!!
2.C语言动态分配内存的方式,C++动态分配内存的方式?
C malloc
C++ new(根据类型动态分配内存,然后保存返回地址)
Int *ptr=new int;
3.new和delete使用的坑?
1.配套使用,防止内存泄漏(有new就要有delete,delete的操作对象一定要是new产生的)
2.已经delete过的指针不能再delete,会产生空指针错误
3.C++没有内存回收机制,给程序员带来了一定灵活性,但在复杂系统中容易引发严重的问题。
4.new [] 与delete[] 配套使用
Int * ptr = new int [10]
Delete [] ptr
4.用new创建数组和C语言的方式创建数组的区别?
New创建的数组是动态数组,char arr[10]是静态的(给内存分配资源的方式:静态联编、动态联编)
区别在于前者是栈空间,后者是堆空间,后者可以用程序控制是否创建,什么情况下创建以及数组的长度,这是动态数组,动态创建的方式创建的内存在堆空间,也更加灵活。
5.C++的new关键字可用于创建什么?
指针,数组,结构体,类对象
创建数组时,指明数组的类型和长度;delete时,也要指明类型
Int * ptr = new [10] int
Delete [10] int
创建结构体后,访问成员变量用-> ,C语言访问用.,
内存分配
1.描述C++内存分配的三种方式?
自动存储:函数内部的局部变量,又叫自动变量,在栈上(系统自动分配,自动释放)
静态存储:两种声明方式(全局变量,或函数内的static)前者作用域较大,不好在函数内部控制,后者只会初始化一次,按需求使用
动态存储:用new和delete关键字,会另外维持一个内存池(堆上,又叫自由存储空间),作用域:可以在一个函数中分配内存,在另一个函数内释放,其生命周期更灵活,不受函数的限制,但是相比于自动回收机制,可能会导致内存分片时不连续,重新分配内存时更困难。
线程存储:
表达式:
1.前缀表达式和后缀表达式在执行效率上有什么区别?
x++:后缀表达式,会先生成一个拷贝,再把拷贝值赋给原值
++x:直接在原值上修改
因此++x效率更高,但两者仅有细微的差别
2.前后缀表达式和解引用的优先级
前缀与解引用优先级一样,从右到左结合 如:*++p,先自增,再解引用
++*p 先解引用,再自增
后缀表达式比解引用优先级高,*p++,先自增再解引用
3.while与do while 的差别
while是入口条件,do while是出口条件
因此do while可以确保程序至少执行一次,while和for必须判断满足条件才会执行
4.C++的for循环增加了那些新特性?
可以基于范围进行循环,类似python
Double price[5]={1,2,3,4,5}
For(double x: price){
Cout<<x<<end;
}//x只是一个拷贝值,如果在循环体内修改x,对原数组没有影响。
Double price[5]={1,2,3,4,5}
For(double & x: price){
Cout<<x<<end;
}//如果把x设为引用,那修改x就相当于修改了原数组