![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c++
不过普通话一乙不改名
凡事预则立,不预则废
展开
-
24.纯虚函数和抽象类
1.纯虚函数和抽象类纯虚函数:没有函数体的虚函数class a{ private:int a; public: virtual void print() =0;//纯虚函数};抽象类:包含纯虚函数的类叫抽象类抽象类只能作为基类来派生新类使用,不能闯将抽象类的对象。抽象类的指针和引用可以指向由抽象类派生而来的类的对象。A a;//错,A是抽象类,不能闯将对象A *pa;//ok,可以定义抽象类的指针和引用pa=new A;//错误,A是抽象类,不能创建对象原创 2020-06-04 22:32:47 · 278 阅读 · 0 评论 -
23.虚析构函数
1.虚析构函数通过基类的指针删除派生类的对象时,通常情况下只调用基类的析构函数。但是删除一个派生类的对象时,应该先调用派生类的析构函数,然后调用基类的析构函数。2.解决办法:把基类的析构函数声明为virtual派生类的析构函数可以virtual不进行声明通过基类的指针删除派生类对象时,首先调用派生类的析构函数,然后调用基类的析构函数。3.错误例子证明:class son{ public: ~son(){cout<<"bye from son"<<原创 2020-06-04 22:30:31 · 178 阅读 · 0 评论 -
22.多态的实现原理
1.思考:“多态”的关键在于基类指针或引用调用一个虚函数时,编译时不去欸的那个到底调用的时基类还是派生类的函数,运行时才确定—这叫“动态连边”。“动态连边”到底是怎么实现的呢?2.提示:请看下面例子程序class base{ public: int i; virtual void print(){cout<<"base:print";}};class derrived:public base{ public: int原创 2020-06-04 22:28:02 · 157 阅读 · 0 评论 -
21.虚函数和多态的基本概念
1.虚函数在类的定义中,前面由virtual关键字的成员函数就是虚函数class base{ virtual int get();};int base::get(){}–virtual关键字只用在类定义里的函数声明中,写函数体时不用。–构造函数和静态成员函数不能是虚函数2.多态的表现形式之一–派生类的指针可以赋值给基类指针。–通过基类指针调用派生类中和基类同同名的虚函数时:1)若该指针指向一个基类对象,那么被调用的是基类的虚函数。2)若该指针指向一个派生类的对象,那么被调用原创 2020-06-04 22:25:05 · 169 阅读 · 0 评论 -
20.公有继承的赋值兼容原则
1.public继承的赋值兼容规则class base{};class derived:public base{};base b;derived d;1)派生类的对象可以赋值给基类对象b=d;2)派生类对象可以初始化基类引用base &br=d;3)派生类对象的地址可以赋值给基类指针base *pd=&d;注意:如果派生方式是private或者protected,则上述三条不可行2.直接基类与间接基类–在声明派生类时,只需要列出他的直接基类–派生类沿着类的层次自原创 2020-05-31 00:47:55 · 301 阅读 · 0 评论 -
19.派生类的构造函数
文章目录1.派生类的构造函数2.包含成员对象的派生类的构造函数1.派生类的构造函数class bug{ private: int nlegs; int ncolor; public: int ntypt; bug(int legs,int color); void printbug(){}; };class flyclass:public bug{ int nwings; pu原创 2020-05-31 00:45:28 · 229 阅读 · 0 评论 -
18.覆盖和保护成员
文章目录1.覆盖2.基类和派生类具有同名成员的情况。3.另一种存取权限说明符:protected1.覆盖派生类可以定义一个和基类成员同名的成员,这叫做覆盖。在派生类中访问这样的的类成员时,缺省的情况是访问派生类中定义的成员。要在派生类中访问由基类定义的同名成员时,要使用作用域符::。2.基类和派生类具有同名成员的情况。class base{ int j; public: int i; void func();};class derived:pub原创 2020-05-31 00:43:02 · 122 阅读 · 0 评论 -
17.继承关系和复合关系
文章目录1.类之间的两种关系2.继承关系的使用3.复合关系的使用1.类之间的两种关系继承:“是”关系。–基类A,B是基类A的派生类–逻辑上要求:一个B对象也是一个A对象。复合:“有”关系–类C中“有”成员变量k,k是类D的对象,则C和D是复合关系–一般逻辑上要求:D对象是C对象的固有属性或者组成部分。2.继承关系的使用写了一个cman类代表男人后来又发现需要一个cwoman类来代表女人cwoman类和cman类有共同之处就让cwoman类从cman类派生而来,是否合适?这是不合理的原创 2020-05-31 00:38:55 · 211 阅读 · 0 评论 -
17.继承和派生的基本概念
文章目录1.继承和派生的基本概念2.派生类的写法3.派生类对象的内存空间1.继承和派生的基本概念继承:在定义一个新的类B时,如果该类与某个已有的类A相似(指的是B拥有A的全部特点),那么就可以把A作为一个基类,而把B作为基类的一个派生类(也成为子类)。派生类是通过对基类进行修改和扩充得到的。在派生类中,可以扩充新的成员变量和成员函数。派生类一旦定义以后,可以独立使用,不依赖于基类。派生类拥有基类的全部成员函数和成员变量,不论是private,protected,public。在派生类的各个成员函原创 2020-05-31 00:34:51 · 1103 阅读 · 0 评论 -
16.类型转换运算符重载
1.重载类型转换运算符#include <iostream>using namespace std;class complex{ double real,imag; public: complex(double r=0,double i=0):real(r),imag(i){}; operator double (){return real;}};int main(){ complex c(1.2,3,4); cout原创 2020-05-27 07:29:55 · 256 阅读 · 0 评论 -
15.流插入和流输出运算符重载
1.cout是在iostream中定义的,ostream类的对象<<能用在cout上是因为在iostream中对<<进行了重载。所以我们只能把<<重载为全局函数。那怎么重载才能使得cout<<cstudent和cout<<this都能成立呢?class cstudent{ public:int nage;};int main(){ cstudent s; s.nage=5; cout<<s&原创 2020-05-27 07:29:00 · 230 阅读 · 0 评论 -
14.可变长数组的实现
1.要编写可变长数组类,使之能够如下使用int main(){ carray a; for(int i=0;i<5;i++) a.push_back(i); //动态内存分配,须要一个指针成员变量 carray a2,a3; a2=a; //需要重载= for(int i=0;i<a.length();i++) cout<<a2[i]<<"" ; a2=a3;原创 2020-05-27 07:26:04 · 403 阅读 · 0 评论 -
13.运算符重载为友元
1.一般情况下,将运算符重载为类的成员函数,是较好的选择。2.但有时,重载为成员函数不能满足使用要求,重载为普通函数,又不能访问私有成员,所以需要将运算符重载为友元。class complex{ double real,imag; public: complex(double r,double i):real(r),imag(i){}; complex operator + (double r);};complex complex::operator原创 2020-05-27 07:23:17 · 103 阅读 · 0 评论 -
12.赋值运算符的重载
1.有时候希望赋值运算符两边的类型可以不匹配,比如,把一个int类型变量赋值给一个complex对象,或者把一个char*类型的字符串赋值给一个字符串对象,此时就需要重载赋值运算符=。赋值运算符“=”只能重载为成员函数。class string{ private: char *string; public: string():str(new char[1]){str[0]=0;}; const char *c_st原创 2020-05-27 07:18:53 · 238 阅读 · 0 评论 -
11.运算符重载的基本概念
文章目录1.运算符重载的需求2:运算符重载:3.运算符重载的形式1.运算符重载的需求C++预定义的运算符,只能用于基本数据类型的运算:整型,实型,字符型,逻辑型。不能用于对象的运算,有时候又需要对象之间的运算。】在数学上,两个符数可以直接进行±等运算。但是在c++中,直接将+或者-用于复数对象是不允许的。有时候希望,让对象也能通过运算符进行计算。这样代码更加简介,更加易于理解。例如;complex_a和complex_b是两个复数对象;求两个复数的和,希望能直接写:complex_a+com原创 2020-05-27 07:13:28 · 551 阅读 · 0 评论 -
10.友元
文章目录1.友元函数:一个类的友元函数可以访问该类的私有成员。2.友元类 如果A是B的友元类,那么A的成员函数可以访问B的私有成员。3.友元类之间的关系不能传递,不能继承。友元分为友元函数和友元类1.友元函数:一个类的友元函数可以访问该类的私有成员。class ccar; 提前声明ccar类,以便后面的cdriver类使用calss cdriver{ public: ...原创 2020-04-28 23:27:35 · 108 阅读 · 0 评论 -
10.常量对象,常量成员函数
文章目录1.常量对象2.在类的成员函数说明后面加上const关键字,则该成员函数称为常量成员函数。3.常量成员函数的重载4.常引用1.常量对象如果不希望某个对象的值被改变,则定义该对象的时候可以在前面加上const关键字。class demo{ private: int value; public: void setvalue(){} ...原创 2020-04-28 23:25:45 · 900 阅读 · 0 评论 -
9.成员对象和封闭类
文章目录1.有成员对象的类叫做封闭(enclosing)类2.上例中,如果ccar类不定义构造函数,则 ccar car;语句就会出错。3.封闭类构造函数和析构函数的执行顺序4.封闭类的复制构造函数1.有成员对象的类叫做封闭(enclosing)类class ctyre //轮胎类{ private: int radius; //半径 int wid...原创 2020-04-28 23:22:48 · 132 阅读 · 0 评论 -
8.静态成员变量和静态
文章目录1.静态成员:在说明前面加上static关键字成员2.访问静态成员3.基本概念4.静态成员变量5.在静态成员函数中,不能访问非静态成员变量,也不能调用非静态成员函数。6.算法缺陷1.静态成员:在说明前面加上static关键字成员普通成员变量每个对象有各自的一份,而静态成员变量一共就一份,为所有对象共享。sizeof运算符不会计算静态成员变量.class cmyclass{ ...原创 2020-04-28 23:19:50 · 246 阅读 · 0 评论 -
7.this指针
1.this指针的作用非静态成员函数中可以直接使用this来代表指向该函数作用的对象的指针。class complex{ public: double real,imag; void print(){cout<<real<<","<<imag;} complex(double r,double i){...原创 2020-04-28 23:15:10 · 89 阅读 · 0 评论 -
6.复制构造函数
文章目录1.基本概念2默认构造函数3.错误构造函数4.复制构造函数起作用的三种情况1)当用一个对象去初始化同类的另外一个对象时2)如果某函数有一个参数是类A的对象,那么该函数被调用时,类A的复制构造函数将被调用。3)如果函数的返回值是类A的对象时,则函数返回时,A的复制构造函数将会被调用5.常量引用参数的使用1.基本概念只有一个参数,即对同类对象的引用。形如X::X(X&)或者X::...原创 2020-04-28 22:33:57 · 146 阅读 · 0 评论 -
5.构造函数
1.构造函数就是对象的初始化class complex{ private: double real,imag; public: complex(double r,doublei=0);};complex::complex(double r,double i){ real=r;imag=i;}complex c1; //error,缺...原创 2020-04-28 22:25:42 · 173 阅读 · 0 评论 -
4.类和对象的基本概念
文章目录1.类的成员函数和类的定义分开写2.类成员的可访问范围3.成员函数可以重载也可以缺省,但是注意不要有二义性。1.类的成员函数和类的定义分开写class crectangle{ public: int w,h; int area(); int perimeter(); void init(int w_,ing h_...原创 2020-04-28 22:16:23 · 112 阅读 · 0 评论 -
3.内联函数和重载函数
文章目录1.内联函数2.函数重载3.函数的缺省的参数1.内联函数函数调用是有开销的,如果函数本身只有几条语句,执行非常快,而且函数被反复执行还能多次,相比之下调用函数所产生的这个开销就会显得比较大。为了减少函数调用的开销,引入内联函数的机制,编译器处理内联函数时,将整个代码插入到指定的位置。inline int max(int a,intb){ if(a>b)return a;...原创 2020-04-28 22:10:45 · 215 阅读 · 0 评论 -
2.引用
1.引用的概念:定义引用时一定要将其初始化成引用某个变量。2.初始化后,他就一直引用该变量,不会再引用其他的变量了。double a=4,b=5;double &r1=a;double &r2=r1;r2=10;cout<<a<<endl;r1=b;cout<<a<<endl;3.C++引用调用函数交换值voi...原创 2020-04-28 22:07:16 · 179 阅读 · 0 评论 -
1.new and delete
1.new一个空间int *pn=new int;//new 返回的类型是 int*2.new一个数组int *pn=new int[N];//N可以是常数也可以是整型表达式。3.释放delete pn;//释放一个变量;delete []pn;//释放一个数组;...原创 2020-04-28 22:02:13 · 196 阅读 · 0 评论