C++ - C++我不知道的基础(一)
2015-08-26 10:23 HermitCarb 阅读(275) 评论(0) 收藏 举报快毕业了,开始准备着实习和工作了,本着高要求的原则(即使学校是二流的,也要把自打造成伪一流的),去百度的校园招聘上看了看,大部分都要求精通C++/Java/PHP,虽然我自认为自己技术不差,但也明白骗骗自己还行,蒙人就还差点火候。再说貌似百度人都是名牌多是北清浙之流,我一屌丝如何和他们比。还是自己努力,争取能够拉近点距离,由于比较想明白语言下面是怎么工作的,所以决定重新学C/C++。
原先一直以为:关于初级C++,自己虽说不上精通,但是也不至于说个什么不知道。
说来打脸,小半本书已经看的我心惊了。常量指针、指针常量、常量指针常量、函数模版、虚析构函数……,好吧,我还是回头重新看吧,顺便把原先自己不知道和已经快忘记的东西记下来,以便自己和游客以后查看吧。
废话不多说了,开始!
参考书籍:Visual C++开发实战/软件开发技术联盟编注,清华大学出版社出版,ISBN:978-7-302-32309-9
第一章、
1.基本类型变量定义并初始化初始化有以下方法:
int a = 1;
int b(2);
int c = new(3);
第二章、
2.寄存器变量:register标示寄存器变量,用于“建议”编译器将变量放置在CPU寄存器中,用于加快访问速度。程序中不能够获取变量地址,也不能成为全局或静态变量,但可以作为形参。如今的编译器都具有优化功能,会自动调整变量的放置,因此应避免使用寄存器变量。
3.外部变量:用于高速编译器在其他文件的全局区存在的全局变量,目的是在当前文件中访问这个全局变量。在要访问全局变量的页面定义一个和全局变量相同的变量,并用extern标示。如:
extern int num;
4.自动变量:指子变量声明时开始,在离开变量作用域时结束,仅限于在函数内使用的变量。局部变量默认就是自动变量,定义一个全局的自动变量是非法的。
5.register(寄存器变量标示),extern(外部变量标示),static(静态变量标示),auto(自动变量标示)四个关键字在定义变量时不能同时使用。
6.实数比较时存在精度问题。常见有的实数零的精度的定义。
7.定义一个数组时,数组长度必须是常量。不像其他语言,如:Java,C#等。定义多维数组时,如要通过提供初始值确定数组维的长度,可省略最高维的长度,必须提供较低维的长度。
8.结构体(关键字:struct)在存储时存在“对齐”问题。即保证下一个成员的(相对结构体起始处)偏移量为该成员数据类型长度的整数倍。
9.位域:允许用户访问一位数据。开发应用程序时有时需要在一个字节中表示多项内容,可以使用位域。如IP首部中长度占4位,版本号占4位,可以如下定义:
typedef struct HeadIP{
unsigned char headerlen:4;
unsigned char version:4;
}
10.共用体类型(关键字:union):结构体类型中每一个成员占用不同的内存空间,如上面结构体在存储时存在的“对齐”问题,但是共用体类型所有成员共享一个内存空间。共用体占用空间的大小等于共用体中占用空间最大的成员所占用的空间。
11.指针变量的“++”(“--”)运算,并不是简单地进行加1,而是对指针自加“sizeof(指针类型)”,即指向其所指变量后紧邻的下一个地址(若指针指向的是数组中的非结尾元素,则“++”运算使指针指向下一个元素)。
12.指针数组和指针的指针:
int **rArray; //定义了一个指针的指针,最普通的指针的指针,指向一个整型指针“int *”。
int *pArray[3]; //定义了一个指针数组,每一个元素是一个指针。数组名指向第一个元素的地址。即使用pArray时,它是指针的指针。
int (*qArray)[3]; //定义了一个指针的指针,它限定了其所指向的数组的维数和维长为int[3]。
13.常量指针、指针常量及常量指针常量:(指针关键字“*”)
const int *ptr1; //定义常量指针
int const *ptr2; //定义常量指针
int *const ptr3 //定义指针常量
const int *const ptr4; //定义常量指针常量
常量指针其所指向的数据不可以被修改,但可以修改其指向的地址;指针常量其所指向的地址不可以被修改,但可以修改其指向的数据;常量指针常量所指向的数据和地址均不可以修改。
14.引用类型(关键字“&”):引用是一个已存在对象的别名(注意值传递和引用传递),一旦用一个对象初始化一个引用对象后,则对引用对象的所有操作亦是对原对象的操作。无法对一个以初始化的引用对象的目标对象进行替换。引用类型变量不能引用字面常量或临时值,但常量引用可以引用字面常量或临时值,此时相当于定义了一个常量。引用常量虽然合法但是没有意义的。如:
int num = 5;
int const &dNum1 = num; //定义常量引用
int const &dNum2 = num; //定义常量引用
int &const dNum3 = num; //定义引用常量
15.通过关键字:typedef定义类型别名。如:
typedef unsigned char UCHAR; //定义UCHAR为unsigned char的一个别名
16.基本数据类型转换:适当使用类型转换可以提高运算效率。如:
int num = (int)10.5 + 5;
a.隐式转换:不同(基本数据)类型的数据进行运算时,总是向数据表示能力高的地方自动转换。
b.显示转换(强制转换):在无法隐式转换时又需要进行转换。如(int)3.14和int(3.14),不安全的方法。
c.静态转换(关键字“static_cast<目标数据类型>”):C++提供的强制类型转换的一种方式,常用于对基本数据类型的转换,具有一定的安全性,如防止把整型指针转换为结构体类型指针。
d.动态转换(关键字“dynamic_cast<目标数据类型>”):C++提供的强制类型转换的一种方式,常用于对类对象之间的转换,具有一定的安全性,在转换前进行类型检查。如果指针类型不兼容,则返回NULL。
e.常量转换(关键字“const_cast<目标数据类型>”):C++提供的强制类型转换的一种方式,用于将const对象转换为非const对象。具有一定的安全性,不允许不匹配的类型转换,如“int *”转换成“long *”。转换实例如:
const int MAX_LEN = 100;
int *pLen = const_cast<int *>(&MAX_LEN); //此时可以通过pLen修改MAX_LEN地址处的值,但常量在编译是直接翻译成常量值100的,不进行寻址的。
f.重解释转换(关键字“reinterpre_cast<目标数据类型>”):能够将任何指针类型转换为其他指针类型,不安全的方法。不能够将常量指针转换为非常量指针。
17.数值类型与字符串转换:
a.字符串转换成整数: int atoi(const char *string);
//ASCIIs to int
b.字符串转换成实数: double atof(const char *string);
//ASCIIs to float/double
c.整数转换成字符串: chart *itoa(int value, char *str, int radix);
//int to ASCIIs;value指待转换的整数,str用于存储函数转换后的字符串,radix基数(通常为10,范围是2~36)
d.实数转换成字符串: chart *fcvt(double value, int count, int *dec, int *sign);
//float/double convert to ASCIIs;value指待转换的实数,count指小数点后的位数(精度),dec用于记录小数点的位置,sign表示数字的符号(0正1负)
18.位运算:很强大的运算。如交换整数的值(异或):
int a = 5, b = 100;
a ^= b;
b ^= a;
a ^= b; //a = 100,b = 5,根本不用再定义一个变量,原来我被老师骗了这么多年
19.sizeof:其几种书写方式,可用于变量的两种方式和用于类型的一种方式:
int num = 5;
sizeof(num);
sizeof num;
sizeof(int);
sizeof对指针类型的运算结果取决于系统位数(地址长度);注意字符串的结束标志。
20.数据的两种存储方式:栈和堆。栈用于存储占用空间小,生存周期短的数据,如局部变量和函数参数等。堆用于存储占用空间大,生命周期长的数据,如静态变量和全局变量。
21.new和delete:通过new创建的数据存放在堆中,数据使用完后,一定要用delete释放在堆中开辟的存储空间。new可以在堆中为数组开辟空间,但不可以为数组初始化。new可以为定义了构造函数的类对象开辟空间并为其初始化。基本数据类型包括其数组没有析构函数,delee释放时不会出现内存泄露;但对于类对象数组,如果包含在堆中分配的数据成员,则必须使用“delete []”的方式。建议释放数组时统一使用“delete []aArray;”的方式。
第三章、
22.switch的case和default子句部分定义变量是非法的,但可以放在case或default子句的复合语句中。
23.Visual环境下,if语句和switch语句的表达式里定义的变量的作用域为if语句或switch语句的语句块范围,但for语句的表达式中定义的变量的作用域为从声明变量处开始到包含该for语句的语句块或复合语句结束处结束。
24.跳转语句:break、continue、goto、return、exit。
a.break:跳出循环语句或跳出switch语句。
b.continue:结束当前循环,进行下一次循环。
c.goto:跳转到指定的标号处,在结束多层循环时比较方便,但使程序难以控制,应尽量少用,必要时可以使用。
d.return:用于退出当前调用的函数。
e.exit:终止当前调用的进程,通常用于结束当前的应用程序。
浙公网安备 33010602011771号