#include <iostream>
using namespace std;//使用std块,这样就不需要std::cout这样写了。
class A
{
public:
A(int a,int b):x1(a),x2(b)
{
cout <<"class A a&b: " << a <<" & "<< b <<endl;
cout <<"class A x1&x2: " << x1 <<" & "<< x2 <<endl;
};//这里有没分号都可以
~A(){};
int x2;
private:
int x1;
};
class C
{
public:
C(int a):x1(a),x2(4){};//构造函数
~C(){};//析构函数
int x1;
// friend void B::c_friend();不能在这friend,因为B类在后面还没定义声明
const int x2;
static const float x3;//静态要放在类外面定义
void b_friend();
//不能在这里实现函数,因为在创建B类对象的时候,会有B类未声明错误。
//在class C前class B;声明,也不支持创建对象。所以放在了B类后面实现函数。
};
const float C::x3=3.14f;//注意还有个const常量标志
class B : public A
{
public:
B(int a,int b,int c,int d):A(a,b),c1(c),x1(d){}//冒号语法赋值和传参,int d=1可设定默认参数,设默认参数的得放在后面。
~B(){};
C c1;//相当于组合类,创建了C类对象,所以得放在前面先声明。
// int x2;
/*如果没有重定义x2,输出的就是A类的x2,继承过来了。
而A类的x1就继承不了,私有的*/
void show()
{
cout <<"class B x1&x2: " << x1 <<" & "<< x2 <<endl;
}
friend void C::b_friend();//友元函数,调用private里的内容
private:
int x1;
};
void C::b_friend()//注意前面还有C::要不然B不认这个friend
{
B b1(1,2,3,4);
cout <<"class B private x1 = " <<b1.x1<<endl;
}
int main(int argc, char const *argv[])
{
B b1(1,2,3,4);//创建对象时,要传入构造函数需要的参,否则会报错
/*
创建对象后,会先调用父构造函数。
所以B类一定得有构造函数,除非父类没构造函数。
子类的构造函数给父类构造函数传实参
最开始的先传给父类构造函数。
*/
b1.show();
cout << "class C x1&x2&x3= " << b1.c1.x1<<" & "<< b1.c1.x2 <<" & "<<b1.c1.x3<<endl;
b1.c1.b_friend();
return 0;
}
C++入门基础语法
最新推荐文章于 2024-08-17 11:27:40 发布