#include<string>#include<iostream>usingnamespace std;classcar{public:string corlor;string id;void(*printInfo)(string corlor,string id);//这个是函数指针变量voidprintCarInfo()//成员函数在内部实现{cout <<"成员函数打印"<< endl;cout <<"汽车颜色:"<< corlor <<"汽车车牌号"<< id <<endl;}voidprintCarInfo2();//成员函数在内部声明,一般在.cpp文件里面实现class中声明的函数};void car ::printCarInfo2(){cout <<"成员函数在外部实现"<< endl;}voidprintInfo(string a,string b){string ret ="颜色:"+ a +"车牌号:"+ b;cout << ret <<endl;}intmain(){car mycar;mycar.corlor ="black";mycar.id ="京A888888";mycar.printInfo = printInfo;car mycar2 ={.corlor ="white",.id ="京A666666",.printInfo = printInfo,};car *mycar3 =newcar();mycar3 ->id ="冀A88888888";mycar3 ->corlor ="blue";mycar3 ->printInfo =printInfo;mycar.printInfo(mycar.corlor,mycar.id);mycar2.printInfo(mycar2.corlor,mycar2.id);mycar3->printInfo(mycar3->corlor,mycar3->id);cout <<"下面是成员函数输出内容:"<< endl;mycar.printCarInfo();mycar2.printCarInfo();mycar3->printCarInfo();mycar.printCarInfo2();mycar2.printCarInfo2();mycar3->printCarInfo2();return0;}
C++引用的使用
#include<iostream>usingnamespace std;voidswap(int& c,int& d){int temp;temp = c;c = d;d =temp;}double vals[]={1.1,1.2,1.3};double&setvalue(int i){double&ref = vals[i];return ref;}//int& getdata()//{// int a = 10 ,b = 10;// int& ra = a;// return ra; //当返回一个引用时,要注意被引用的对象不能超出作用域,所以返回一个局部变量的的引用是不合法的(函数调用完就将空间释放了),可以返回一个静态变量的引用。//}intmain(){int a =10;int b =20;cout <<"交换之前:"<< endl;cout <<"a ="<< a <<endl;cout <<"b ="<< b <<endl;swap(a,b);cout <<"交换之后:"<< endl;cout <<"a ="<< a <<endl;cout <<"b ="<< b <<endl;setvalue(2)=10.5;//其实就是函数返回vals[2]的引用,就是vals[2]的别名,然后对别名进行操作就是对其本身进行操作,所以引用可以当左值cout << vals[2]<<endl;return0;}
#include<iostream>//引用变量是一个别名,也就是说,他是某个已经存在变量的另一个名字//引用相当于又给这个内存中的数据提供了一个新的变量名,这个变量名比传统数据名更特殊,是直达地址的/*
引用与指针的区别:
1、不存在空引用,引用必须连接到一块合法的内存
2、一旦引用被初始化一个对象,就不能被指向另一个对象,指针可以在任何时候指向另一个对象
3、引用必须在创建的时候初始化,指针可以在任何时间初始化
4、官方没有明确说明,但是引用确实不是传统意义上的独立变量,他不可以“变”
5、引用和指针一样也区分类型
*/usingnamespace std;intmain(){//声明简单的变量int i;double d;//声明引用变量int& r = i;double& s = d;i =5;cout <<"value of i:"<< i << endl;cout <<"refrence of i:"<< r <<endl;d =10.121;cout <<"value of d:"<< d << endl;cout <<"refrence of d:"<< s <<endl;cout <<"Hello World!"<< endl;return0;}
#include<iostream>usingnamespace std;intmain(){//c语言在C99以前是不支持boo类型l的,在c99之后支持bool类型,C++是支持的bool flag =false;int a =0;int b =0;if(!flag){cin >> a >> b;}cout << a << b << endl;cout <<"Hello World!"<< endl;return0;}
#include<iostream>usingnamespace std;//菱形继承:如果两个基类继承自同一个更高层的基类,这可能导致派生类中存在两份基类的副本,称为菱形继承,可以通过虚继承来解决/*
class Base
{};class A : public Base
{//继承自Base
};class B : public Base
{//继承自Base
};class C : public A, public B
{//继承自A,B
}; //菱形继承
*/classBase{public:int data;Base(int temp_data){this->data = temp_data;}voidprint1(){cout << data << endl;}};classA:virtualpublicBase{public://继承自BaseA(int data):Base(data)//当父类有构造函数的时候要继承父类的构造函数{data =20;}voidprint2(){cout << data << endl;}};classB:virtualpublicBase//虚继承,来解决菱形继承的问题{public://继承自BaseB(int data):Base(data)//当父类有构造函数的时候要继承父类的构造函数{data =30;}voidprint3(){cout << data << endl;}};classC:publicA,publicB{public://继承自A,BC(int data):Base(data),A(data),B(data)//当父类有构造函数的时候,派生类的构造函数要继承其所继承父类的构造函数,并且要按照顺序继承{// this->data = data;}};//菱形继承intmain(){C c(50);c.print1();c.print2();c.print3();return0;}