本人电子科技大学研究生,平时主要做工程项目,6月份开始学习软件开发相关内容,通过看书、pdf资料、博客、面经等。在9月份成功上岸,算是找到一个比较靠谱的工作。因为学校三方的原因,没法发继续等待另外几个口头offer。只能选择先上岸,毕竟追求不加班的品质生活。华为啥的都想相等了。
以下开始就是我学习过程中,自己边学习别人的东西,边键盘输入记录下来的东西。希望对大家有一些帮助。
day1(共用体union,枚举enum,字节占用,this指针、宏定义、条件编译、累的封装、构造函数、析构函数、this指针、静态成员、对象所占内存)
-
共用体定义
union 名称
{
数据类型 成员名;
数据类型 成员名;
}变量名;
一个共用体内可以定义多个数据类型,这些数据共享一段内存。在不同的时间里保存不同的数据类型和长度的变量,以节省空间。但是同一时间只能存储其中一个成员变量的值。 -
枚举enum 枚举名{枚举常量列表}变量名; ,里面元素不能再赋值,也可以强制转换成枚举类型赋值,但也是赋值枚举变量里的数据(按枚举顺序赋值0,1,2,3…),也可以手动赋值,赋值可以相同。例: enum Time{onehour=1,twohour=2,threehour=1}a,b;
-
char 1byte,short 2byte, int 4byte,long 8byte,float 4byte, double 8 byte,long long 8byte
唯一例外,long在32位系统占4byte。
问题:例1.16字节计算认为错误。
3.1 结构体的大小:结构体的大小必须是该结构体字节最大成员的倍数。 -
宏定义 预处理,要求定义是每个元素最好加上(),保持代码稳定性。
带参数的宏定义 最好加上 do while(0),保持成员的不变,因为会把定义的带参函数直接替换,如果存在if else 语句定义的函数有两条语句,替换之后会出错。所以采用:
#define fun(x) do{f(x);f(y);}while(0) 最后没有分号。 -
条件编译,
#ifdef…
#else…
#endif
可以没有#else -
混合编程时,需要C标准的时候,申明:extern “C”,表示是C标准。 _cplusplus是C++的预定义宏。
-
struct里面不能定义成员函数,class里面可以。类中定义成员函数不需要加“;”,类外定义成员函数需要加“;”,且声明函数在public,函数在之后,不能在之前。形式:类名::函数名()。
-
类的封装, private只允许类成员访问,public类成员和类外的任何访问,protect 类成员和派生类成员访问,不允许类外访问。为了实现信息的隐蔽,类的申明一般在头文件,成员函数定义在另一个文件里。使用时都要include头文件。
-
构造函数、成员不能在类中初始化,所以需要构造函数来初始化,函数名称需要和类名一样。也可以在类外定义构造函数,同样也要先声明。使用 类名::类名(){},也可以直接在声明时直接初始化,例:Circle : :Circle(int r) :radius® {} // 后面没有分号。相当于初始化,radius=r。
带参的也可以,Box(int h , int w, int l):height(h) , width(w) , length(l){}
无参构造函数,是默认构造函数,一个类只能一个,带参的构函数属于构造函数重载
也可以在声明构造函数时直接制定默认参数(class Box)Box (int h=2 , int w=2 , int 1=2) ;,使用时若指定新的参数则用新的,没有指定新的就用默认设置的参数。 -
一个类构造函数里参数全都指定默认参数后,不能再定义重载构造函数了。会冲突,不知道调用哪一个函数。
-
析构函数,~函数名(){},主要用来在撤销对象占用内存前做一些清理工作,以便于让内存供新的对象使用。也可以作为用户在最后一次使用对象之后所执行的任何操作。没有编写析构函数时,编译系统会自动生成一个,但不进行任何操作。
-
定义类的静态数据成员,必须在类外定义,声明时用static,初始化时int base : : var=10;不需要加static
静态成员变量可以被所有对象引用,且可以改变其值,区别是静态成员是在对象之外单独开辟一段空间来存放。编译时分配,程序结束时释放,不受其他影响。
可以通过类名引用Base :: var++ ; // 通过类名引用,亦可以通过对象名引用,Base basel ;basel.var++; -
静态成员函数是为了处理静态数据成员,也是在成员函数前加static,静态成员函数不属于对象。非静态成员函数有this指针,静态的没有。所以静态成员函数不能访问本类的非静态成员变量。只是不能默认访问,还是可以 对象名.静态成员变量 形式来访问。
-
非静态成员函数引用使用静态成员变量需要加 类名:: ,而静态成员函数可以直接使用,不需要加类名。
-
一个对象所占的内存空间,非静态成员变量总和加上CPU的数据对齐和支持虚函数所产生的负担,数据成员、成员函数、构造函数、析构函数、虚函数。
C++ 空类的内存占用是 1byte;成员变量按数据类型计算,静态成员变量不占对象内存;成员函数不占空间;构造函数和析构函数也不占内存;虚的析构函数一般占8byte,因为编译虚函数会产生额外负担,是指向虚函数表的指针。指针变量在64位系统占8byte;单继承和多继承还是空类的大小 1 byte,虚继承还是8byte; -
对象内存占用,总的说来就是非静态数据成员占内存的总和,也包括虚函数一类的;且函数的代码是存储在对象空间之外的,且多个对象时共用一个函数代码段。
-
this指针、每个成员函数都有一个特殊的this指针,指向对象的成员数据,赋值为对象的起始地址。this指针是作为隐式使用的。
-
指针自增、自减每次移动的偏移量是指针所指对象的字节大小。
指针相减是指针地址的偏移除以指针每次移动的大小。