C++语言---笔记(一)

一、设计理念:接口要求紧,模块要求松。

二、c++与c比较

  1. C++实用性加强;C中,函数中必须首先定义变量,然后再调用函数,否则会报错;C++不会
  2. register 关键字:C中,告诉编译器把变量放入寄存器中,此时对register修饰的变量取地址会报错,因为寄存器中没有地址。C++中可以驱动register变量的地址。C++编译器有自己的优化方式,不使用register也可能做优化。
  3. C++函数类型检测增强 :C语言中重复定义多个同名的全局变量是合法的(C语言中多个同名的全局变量最终会被链接到全局区的同一个地址空间上),C++中不允许这个操作。
  4. C++ struct 类型加强  : C语言的struct定义了一组变量集合,C编译器不认为这是一种新的类型。C++中的struct是一个新类型的定义声明
  5. C++中所有的变量和函数都必须有类型,C语言中的默认类型在C++中是不合法的
  6. C++新增bool类型;1个字节内存。
  7. 三目运算符   C语言中,表达式的结果方法寄存器,C语言中,表达式的返回值是一个数,三目运算符是一个表达式,表达式不能做左值。C++中,表达式返回的是变量的本身。
  8. const关键字  :const int *c =123 //const所修饰的指针所指向的内存空间不能修改。int * const b//指针变量本身不能被修改  ;;;C语言中的const是冒牌货,const int a=100;int *p=NULL;p=&a;*p=20;//间接赋值。C++中const是一个真正的常量(c++会把const修饰的常量放在符号表里面(key:value)),间接赋值时,与符号表里的值无关。

三、C++中的常用关键词

  •    int a=10;int b=20; int arry[a+b]//linux内核成立,因为linux内核的gcc编译器支持;c和c++编译器都不支持这种语法
  • const int c=10; const int d=20;int array2[a+b];编译通过,类似于 #define c 10;所以const和#define有类似之处。
  • C++中const常量类似于宏定义,但是不同:const常量是由编译器处理的,提供类型检查和作用域检查;宏定义由预处理器处理,单纯的文本替换。const 由编译器处理,#define在编译器预处理阶段处理。
  • #define a 10宏定义的作用域是全局的,在一个函数中定义一个,在另一个函数中可以使用。如果想限制作用域,可以undef卸载宏

四、引用

  1. 引用(普通引用):引用可以看做一个已定义变量的别名 语法:type &name =var;int &b =a;普通引用必须初始化,引用做函数参数声明时不进行初始化;栗子:void main(){int x,y;x=10;y=20;swp(a,b)}   void swp(int &a,int &b){int c=0;c=a;a=b;b=c};//可以进行数值交换
  2. 引用的本质   引用作为其他变量名存在,在一些场合可以替代指针。普通引用有自己的内存空间,和指针一样都是4个字节或8个字节大小。引用在C++内部实现是一个常量指针 type &name==type * const name;C++编译器在编译过程中使用常指针作为引用的内部实现,因此引用所占的空间大小和指针相同。栗子:void func(int &a){ a=5   void func(int *const a){ *a =5}
  3. 函数的返回值是引用(引用当左值)当函数返回值为引用时,若返回栈变量,不能成为其他引用的初始值,不能作为左值使用。若返回静态变量或全局变量,可以成为其他引用的初始值,可为左值可为右值使用。
  4. 常引用:int x=10;const int &y=x;y=20;//会报错。让变量拥有只读属性,不能通过y去改变x的值;
  5. 内联函数:内联函数是为了替代宏代码片段,使用inline关键字声明内联函数。声明内联函数时,inline关键字必须和函数定义结合在一起,否则编译器会直接忽略内联请求。栗子:inline int myfunc(init a,int b){return a<b?a:b;}   int main(){int a=1,b=3; int c=myfunc(a,b);return 0;}。注意:内联函数必须和函数实现在一起;结论:内联函数在编译时直接将函数体插入函数调用的地方;inline只是一种请求,编译器不一定允许这种请求;内敛函数省去了普通函数调用时压栈、跳转和返回的开销
  6. 内联函数和宏代码片段的区别:内联函数由编译器处理,直接将编译后的函数体插入调用的地方;宏代码片段由预处理器处理,进行简单的文本低缓,没有任何编译过程。
  7. C++默认参数:  只有参数列表后面部分的参数才可以提供默认参数;一旦在一个函数中使用默认参数数值,name这个参数后面的所有参数都必须使用默认参数值。栗子:voidmyfunc(int a=10,int b=1000){};;
  8. 函数占位参数:函数调用时,必须写够参数;void func(int a,int){};   栗子2:int  fun(int a, int b,int =0){return a+b;};void main(){ fun(1,2);//或者 fun(1,2,1);//如果默认参数和占位参数在一起,这两种方法都能调出来。
  9. 默认参数和占位参数:可以将占位参数和默认参数结合起来使用,为以后程序的扩展留下线索。兼容C语言程序中可能出现的不规范写法。
  10. 函数重载:函数名相同,参数个数不同或参数类型不同,或参数顺序不同
  11. 友元函数:申明友元函数,可以访问类的私有属性;声明的位置和public private 没关系

  12. 友元类:若B类是A类的友元类,则B类的所有成员函数都是A类的有缘函数,友元类通常实际为一种对数据或类之前传递消息的辅助类。
  13. 运算符重载:本质就是函数;类型  类名::operator op(参数列表){//相对于该类定义的操作}   运算符重载的两种方法:用成员函数、友元函数重载。。二元运算符
  14. 定义运算符重载函数名的步骤:全局函数、运算符函数方法实现运算符重载:1)要承认操作符重载是一个函数,写出函数名称;2)根据操作数,写出函数参数;3)根据业务,完善函数返回值,及实现函数业务。
  15. 前置++和后置++不同,后置++函数参数有占位符,后置++先使用,再++
  16. 函数返回值当左值,需要返回一个引用
  17. 构造函数:::1)在子类对象构造时,需要调用父类构造函数对其继承的来的成员进行初始化;2)在子类对象析构时,需要调用父类析构函数对其继承的来的成员进行清理;3)继承中构造析构调用原则:子类对象在创建时会首先调用父类的构造函数;父类构造函数执行结束后,执行子类的构造函数;当父类的构造函数有参数时,需要在子类的初始化列表中国现实调用;析构函数调用的先后顺序与构造函数相反;4)继承和组合混搭情况下,构造和析构调用原则:先构造父类,再构造成员变量,最后构造自己;先析构自己,再析构成员变量,最后析构父类;5)继承中的同名成员变量处理方法:当子类成员变亮与父类成员变量同名时,子类依然从父类继承同名成员,在子类中通过作用域分辨符::进行同名成员区分(在派生类中使用基类的同名成员,显式的使用类名限定符   b.A::num=21),同名成员存储在内存中的位置不同;
  18. 派生类中static关键字:基类定义的静态成员,将被所有派生类共享,根据静态成员自身的访问特性和派生类的继承特性,在类层次体系中具有不同的汉文性质,派生类中访问静态成员用以下形式说明:   类名::成员或通过对象访问    对象名 .成员
  19. 构造函数没有加访问修饰符,默认是private   
  20. 继承的二义性、虚继承::    class B : virtual public A{}    加上virtual以后,C++编译器会再给变隐式的增加属性
  21. 重载:同一个勒种;重载:父子类中,并且父、子类中的函数必须有完全相同的原型,使用virtual声明之后能够产生多态(不使用virtual,那叫重定义),多态是在运行期间根据具体对象的烈性决定函数调用;
  22. 组合类:指在一个类的数据成员中含有一个或多个类的对象,拥有这种结构的类就叫做组合类
  23. C++中多态实现原理:当类中声明虚函数时,编译器会在勒种生成一个虚函数表,虚函数表示一个存储类成员函数指针的数据结构,虚函数表有编译器自动生成与维护,virtual成员函数会被编译器让如虚函数表中,存在虚函数时,每个对象中都有一个指向虚函数表的指针(vptr指针)
  24. 多态的要素:继承、虚函数

    5.<<输出不了自定义的类,需要重载  友元函数重载左移运算符













  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值