class A
{
private:int i;
public:voidf(A* q);};void A::f(A* q){
q->i=3;
cout<<"A::f() q->i="<<q->i<<endl;}intmain(){
A a;
A b;
a.f(&b);// 输出结果为"A::f() q->i=3”return0;}
class B
{
public:B(){};// 内联函数
private:};
class A
{
private:
B b;int i;
public:// 初始化会早于构造函数,// 当没有显示地初始化对象时,会默认调用无参构造。// 当没有构造函数时,编译器会生成auto default constructor,// 但有构造函数后,编译器将不会生成auto default constructorA():i(0){}};intmain(){
A a;// 会调用A::A().如果写成A a(),则编译器会认为是函数声明。return0;}
3.组合
c++ 提供了两种组合方式:fully 和 ** By reference ** 。
fully: 身体里
by reference : 身体外 (java 中只提供这一种模式)
无论指针指向什么类型,在32位计算机中,永远占4B。
4. 继承
构造顺序: 基类—>派生类,析构顺序: 派生类------->基类
父类私有在子类中存在,但子类不能操作父类私有的成员数据,可以通过一定的规则使用。
class A{
private:int i;
public:A(){cout<<"A::A()"<<endl;};voidset(int i){ this->i=i;};voidprint(){cout<<"A::print(),i="<<i<<endl;};};
class B: public A
{
public:B():A(){cout<<"B::B()"<<endl;}voidf(int i){set(i);//遵循就近原则,调用形参的i//this->i=10;错误的print();};};
子类与父类同名时,会将父类所有同名的函数隐藏掉,不管形参类型是否相同。
class A{
private:int i;
public:A(){cout<<"A::A()"<<endl;};voidset(int i){ this->i=i;};voidprint(){cout<<"A::print(),i="<<i<<endl;};voidprint(int i){cout<<"A::print(),i="<<i<<endl;}};
class B: public A
{
public:B():A(){cout<<"B::B()"<<endl;}voidprint(){ cout<<"B::print()"<<endl;}};intmain(){
B b;
b.print();//打印B::pirnt();//b.print(30); 错误 会将父类与子类同名的函数隐藏掉,只有通过显示方式才能调用
b.A::print();return0;}