c++基础知识点三

来源:互联网 发布:中老年品牌女装 知乎 编辑:程序博客网 时间:2024/05/05 10:13

静态函数的可以对象不用实例化,直接类名.函数名调用


拷贝构造函数:创建一个CExample类包含两个函数,一个构造函数,一个拷贝构造函数,定义一个CExample对象,CExample B = A; // CExample B(A); 也是一样的,那么会自动调用CExample(const CExample& C) 就是我们自定义的拷贝构造函数,它必须的一个参数是本类型的一个引用变量

  1. //全局函数  
  2. CExample g_Fun()  
  3. {  
  4.  CExample temp(0);  
  5.  return temp;  
  6. }  

g_Fun()函数执行到return时,会产生以下几个重要步骤:
(1). 先会产生一个临时变量,就叫XXXX吧。
(2). 然后调用拷贝构造函数把temp的值给XXXX。整个这两个步骤有点像:CExample XXXX(temp);
(3). 在函数执行到最后先析构temp局部变量。
(4). 等g_Fun()执行完后再析构掉XXXX对象。

(注:返回对象将调用复制构造函数,而返回引用不会,效率更高)


由于const函数可以保证不修改类里面的成员变量,那么变量加上mutable可以抵消


常量(const)和引用在一个类里面定义了必须初始化,如果const一个对象,那么不可以调用非const的成员函数


指针数组的应用:创建一个指针数组,每个指针指向一个MainWindow对象,for遍历每个元素,可以p[i]对每个对象进行操作


struct foo{    string name ;    int id ;    foo(string s, int i):name(s), id(i){} ; // 初始化列表};
这里是初始化列表的用法:foo构造函数传进来后,s赋给name,i赋给id


new和delete会自动调用构造析构函数,而malloc和free只会分配内存,不会调用


多继承:

当一个类继承了另外两个类时,那么写它的构造函数也应当这样写

这样调用zajiao的构造函数时候也分别调用了继承的那两个类的构造函数,调用函数方法的时候这样调用区分3个


私有继承是把父类所有变量都变成私有,保护继承是把父类公有变量变成保护变量


假设一个类fushu,代码 fushu fu=10;会自动进行隐式转换也即fushu fu=fushu(10);(该代码和fushu fu=(fushu)10等同)将10作为参数跳转到fushu的构造函数,然而如果我们不想让他进行隐式转换需要在构造函数前面加上explicit,必须前面加上fushu这样的显示转换才可以

这里fushu fu=10可以转化为fushu fu(10);那么我们zhengshu zheng;  fushu fu=zheng这样是不行的两个对象类型不匹配,如何让它成立呢,因为fushu fu=zheng等价为fushu fu(zheng);那我我们在fushu 的构造函数中传参传zhengshu对象就可以了


父类的指针可以用个强转成子类指针访问子类的同名函数

抽象类不可以实例化,把所有接口都实现了才可以实例化,一个或多个虚函数是个指向虚函数表的指针,占4个字节


类模板:


初始化两个类模板,当传入t111时,赋值给t11。传入t222赋值给t22实际调用的时候传入实际类的类型即可



这里final函数必须是虚函数,作用是该函数无法重写

override只存在于子类当中,且函数是父类含有的且是虚函数,用于警示覆写父类的同名函数


一般类里定义一个static变量可以用来记录创建的对象数目

在构造函数中使用new来分配内存时,必须在相应的析构函数汇总使用delete来释放内存,如果使用new[]来分配内存,使用deletel[]来释放


一个对象里面不要这样复制字符串(指针):sailor.str=sport.str这样是字符串的指针复制,这样会析构两次,出错,解决办法是深拷贝,同理对象赋值里面包含指针你就要小心了,要用深拷贝

StringBad::StringBad(const StringBad & st)

{

len=st.len;

str=new char[len+1];

std::strcpy(str,st.str);

}


这里this指什么呢,我觉得调用的是String对象里面的方法,所以指String对象

String & String ::operator=(const String & st)

{

if(this==&st)

return *this;

}


静态联编:由于重载,编译器必须查看函数参数以及函数名才能确定是哪个参数,这种在编译过程完成的联编叫静态联编

动态联编:编译器必须生成能够在程序运行时选择正确的虚方法的代码


如果定义的类将被用作基类,那么应将这些要在子类中重新定义的类声明为虚的,虚函数为了重载和多态,在基类中有定义,所以子类中可以重写也可以不写,纯虚函数(在虚函数后面加上=0为纯虚)在基类中不定义,必须在子类中加以实现


创建子类对象时,先调用基类的构造方法,然后调用子类的构造方法,删除对象时,先调用子类的析构,在调用父类


抽象模板类:


由于抽象类不能实例化,那么只能用一个指针来进行初始化







使用c++在一个字符串提取子字符串,先创建一个结构体,保存所以可能类型,然后扫描完可以输出所有的子字符串


这里每个字符串中间有个空格所以我们可以提取子字符串,如果每个字符串直接是#我们可以将#换成空格然后。。。


内存映射:对于几TB的海量存储,不能用一些ReadFile,WriteFile这些api来读写文件,将文件从磁盘加载到内存,可以解决多个进程共享数据的问题


Lambda表达式:是一个匿名函数,即没有函数名的函数。,比如在c++中

如果在[]当中加this,说明要引用this

这里->指的返回类型为double


有空看看100条经典的c++笔试题目,

0 0
原创粉丝点击