![]()
建立类模板的对象时,需要先将类模板实例化,也就是类模板传递参数完成实例化,先指明这个对象,然后在实例化这个对象
![]()
结构体包含成员函数,能够实现继承和多态,结构体除了访问权限和类不一样外,几乎可以说是一模一样
![]()
const在*号左边时,表示指向的值不变,位于*右时,指针的指向不能改变
![]()
#ifndef、#define、#endif 是预处理命令,它们一起用来根据不同情况编译不同代码、产生不同目标文件的机制,称为条件编译。一般可以用于防止头文件重复包含。
![]()
main函数里面的s没有被初始化,编译时会报警,运行时会报错
假设s被初始化后,f()函数里面局部变量t的大小为7,而strcpy函数会复制example末尾的\0 所以example+'\0'一共8个字节空间,会溢出,程序会崩溃。
3.就算局部变量t的大小足够大,在fun函数运行结束后,局部变量t的内存空间会被释放掉,此时s成为野指针;返回main函数后,也不会输出example。
![]()
gcc 和 GCC 是两个不同的东西
GCC:GNU Compiler Collection(GUN 编译器集合),它可以编译C、C++、JAV、Fortran、Pascal、Object-C、Ada等语言。
gcc是GCC中的GUN C Compiler(C 编译器)
g++是GCC中的GUN C++ Compiler(C++编译器)
一个有趣的事实就是,就本质而言,gcc和g++并不是编译器,也不是编译器的集合,它们只是一种驱动器,根据参数中要编译的文件的类型,调用对应的GUN编译器而已,比如,用gcc编译一个c文件的话,会有以下几个步骤:
Step1:Call a preprocessor, like cpp.
Step2:Call an actual compiler, like cc or cc1.
Step3:Call an assembler, like as.
Step4:Call a linker, like ld
由于编译器是可以更换的,所以gcc不仅仅可以编译C文件
所以,更准确的说法是:gcc调用了C compiler,而g++调用了C++ compiler
gcc和g++的主要区别
1. 对于 *.c和*.cpp文件,gcc分别当做c和cpp文件编译(c和cpp的语法强度是不一样的)
2. 对于 *.c和*.cpp文件,g++则统一当做cpp文件编译
3. 使用g++编译文件时,g++会自动链接标准库STL,而gcc不会自动链接STL
4. gcc在编译C文件时,可使用的预定义宏是比较少的
5. gcc在编译cpp文件时/g++在编译c文件和cpp文件时(这时候gcc和g++调用的都是cpp文件的编译器),会加入一些额外的宏
![]()
![]()
一、赋值兼容
1.子类对象可以赋值给父类对象
2.子类对象可以初始化父类对象
3.父类指针可以指向子类对象
4.父类引用可以引用子类对象
二.子类重写父类
当父类指针(引用)指向子类对象时,子类对象退化成父类对象,只能访问父类中定义的成员
如果B对象没有virtual修饰的话,B* pb = ⅆ dd就会退化为父类对象,pd就只能访问父类的成员B::Fun()。
但是又virtual修饰的话,就会展现多态行为,会根据实际指针指向的对象判断函数的调用。pb 和pd都指向子类对象,所以调用D::Fun()。
![]()
合法的浮点数有两种表示形式:
十进制小数形式。他有数字和小数点组成,必须有小数点。例如(123.)(123.0)(.123)。 指数形式。如123e3。字母e(或E)之前必须有数字,e后面的指数必须为整数。规范化的指数形式里面,小数点前面有且只有一位非零的数字。如1.2345e8
![]()
![]()
CA* pa =&c;这句话是父类指针指向子类对象,调用pa->f1()时,因为父类中的f1()是虚函数,所以将发生动态绑定,调用子类CB中的f1()函数,先输出CB::f1()
在CB类的f1()函数中,调用非虚函数f2(),但因为其父类CA中的f2()函数并不是virtual函数,所以将调用CB类中的f2()函数,输出CB::f2()。如果将CA类中的f2()改成虚函数,那么将输出CC::f2();如果将CB类中的f2()改成虚函数,也将输出CC::f2(),这是满足动态绑定的。
![]()
![]()
A,正确,#define定义的宏是在预处理阶段进行替换的,const常量是在编译、运行阶段进行使用的。
注意是仅仅的字符串替换,并不会检查其合法性。
预处理阶段做了的任务:
1:将头文件中的内容(源文件之外的文件)插入到源文件中
2:进行了宏替换的过程(简单的字符串替换),定义和替换了由#define指令定义的符号
3:删除掉注释的过程,注释是不会带入到编译阶段
4:条件编译
B,正确,所有的宏替换只是简单的字符串替换,注意是字符串替换,所以并不会检查其合法性,而const定义的常量依然是内置类型等,所以会对其进行类型安全检查。
C,正确,宏定义在程序中使用了几次在预处理阶段就会被展开几次,并不会增加内存占用,但是宏定义每展开一次,代码的长度就要发生变化(所以有利必有弊啊!),而const常量也会为其分配内存(如果是动态申请空间肯定就是堆中了)。
D,错误,const定义的常量只有一次拷贝没毛病,而define定义的变量在内存中并没有拷贝,因为所有的预处理指令都在预处理时进行了替换。