秋招C++开发学习之路day1

本人电子科技大学研究生,平时主要做工程项目,6月份开始学习软件开发相关内容,通过看书、pdf资料、博客、面经等。在9月份成功上岸,算是找到一个比较靠谱的工作。因为学校三方的原因,没法发继续等待另外几个口头offer。只能选择先上岸,毕竟追求不加班的品质生活。华为啥的都想相等了。
以下开始就是我学习过程中,自己边学习别人的东西,边键盘输入记录下来的东西。希望对大家有一些帮助。

day1(共用体union,枚举enum,字节占用,this指针、宏定义、条件编译、累的封装、构造函数、析构函数、this指针、静态成员、对象所占内存)

  1. 共用体定义
    union 名称
    {
    数据类型 成员名;
    数据类型 成员名;
    }变量名;
    一个共用体内可以定义多个数据类型,这些数据共享一段内存。在不同的时间里保存不同的数据类型和长度的变量,以节省空间。但是同一时间只能存储其中一个成员变量的值。

  2. 枚举enum 枚举名{枚举常量列表}变量名; ,里面元素不能再赋值,也可以强制转换成枚举类型赋值,但也是赋值枚举变量里的数据(按枚举顺序赋值0,1,2,3…),也可以手动赋值,赋值可以相同。例: enum Time{onehour=1,twohour=2,threehour=1}a,b;

  3. char 1byte,short 2byte, int 4byte,long 8byte,float 4byte, double 8 byte,long long 8byte
    唯一例外,long在32位系统占4byte。
    问题:例1.16字节计算认为错误。
    3.1 结构体的大小:结构体的大小必须是该结构体字节最大成员的倍数。

  4. 宏定义 预处理,要求定义是每个元素最好加上(),保持代码稳定性。
    带参数的宏定义 最好加上 do while(0),保持成员的不变,因为会把定义的带参函数直接替换,如果存在if else 语句定义的函数有两条语句,替换之后会出错。所以采用:
    #define fun(x) do{f(x);f(y);}while(0) 最后没有分号。

  5. 条件编译,
    #ifdef…
    #else…
    #endif
    可以没有#else

  6. 混合编程时,需要C标准的时候,申明:extern “C”,表示是C标准。 _cplusplus是C++的预定义宏。

  7. struct里面不能定义成员函数,class里面可以。类中定义成员函数不需要加“;”,类外定义成员函数需要加“;”,且声明函数在public,函数在之后,不能在之前。形式:类名::函数名()。

  8. 类的封装, private只允许类成员访问,public类成员和类外的任何访问,protect 类成员和派生类成员访问,不允许类外访问。为了实现信息的隐蔽,类的申明一般在头文件,成员函数定义在另一个文件里。使用时都要include头文件。

  9. 构造函数、成员不能在类中初始化,所以需要构造函数来初始化,函数名称需要和类名一样。也可以在类外定义构造函数,同样也要先声明。使用 类名::类名(){},也可以直接在声明时直接初始化,例: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) ;,使用时若指定新的参数则用新的,没有指定新的就用默认设置的参数。

  10. 一个类构造函数里参数全都指定默认参数后,不能再定义重载构造函数了。会冲突,不知道调用哪一个函数。

  11. 析构函数,~函数名(){},主要用来在撤销对象占用内存前做一些清理工作,以便于让内存供新的对象使用。也可以作为用户在最后一次使用对象之后所执行的任何操作。没有编写析构函数时,编译系统会自动生成一个,但不进行任何操作。

  12. 定义类的静态数据成员,必须在类外定义,声明时用static,初始化时int base : : var=10;不需要加static
    静态成员变量可以被所有对象引用,且可以改变其值,区别是静态成员是在对象之外单独开辟一段空间来存放。编译时分配,程序结束时释放,不受其他影响。
    可以通过类名引用Base :: var++ ; // 通过类名引用,亦可以通过对象名引用,Base basel ;basel.var++;

  13. 静态成员函数是为了处理静态数据成员,也是在成员函数前加static,静态成员函数不属于对象。非静态成员函数有this指针,静态的没有。所以静态成员函数不能访问本类的非静态成员变量。只是不能默认访问,还是可以 对象名.静态成员变量 形式来访问。

  14. 非静态成员函数引用使用静态成员变量需要加 类名:: ,而静态成员函数可以直接使用,不需要加类名。

  15. 一个对象所占的内存空间,非静态成员变量总和加上CPU的数据对齐和支持虚函数所产生的负担,数据成员、成员函数、构造函数、析构函数、虚函数。
    C++ 空类的内存占用是 1byte;成员变量按数据类型计算,静态成员变量不占对象内存;成员函数不占空间;构造函数和析构函数也不占内存;虚的析构函数一般占8byte,因为编译虚函数会产生额外负担,是指向虚函数表的指针。指针变量在64位系统占8byte;单继承和多继承还是空类的大小 1 byte,虚继承还是8byte;

  16. 对象内存占用,总的说来就是非静态数据成员占内存的总和,也包括虚函数一类的;且函数的代码是存储在对象空间之外的,且多个对象时共用一个函数代码段。

  17. this指针、每个成员函数都有一个特殊的this指针,指向对象的成员数据,赋值为对象的起始地址。this指针是作为隐式使用的。

  18. 指针自增、自减每次移动的偏移量是指针所指对象的字节大小。
    指针相减是指针地址的偏移除以指针每次移动的大小。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值