欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C++ struct扩展

程序员文章站 2022-04-28 19:19:47
...

    目录

1、定义

2、继承

3、模板


      在GNU C++标准库的源码中有大量的struct的应用,其用法看着跟class基本一样,显然C++对C中的struct做了扩展,这两者之间有啥区别了?

1、定义

     struct一样支持访问控制,构造函数,析构函数,列表初始化语法,静态成员,内联函数,友元函数等,class支持的功能都可以用到struct上,两者最大的区别是struct的默认访问权限是public,而class默认是private。

#include <iostream>

using std::cout;

struct A{
	//默认是public
	int a=1;
	static int b;
	A(int i):a(i){cout<<"construct A\n";};
	~A(){cout<<"destroy A\n";};
	void show();
private:
	int c=2;
	friend void showC(A & a);
};

void A::show(){
	cout<<"struct A,a="<<a<<"\n";
}

void showC(A & a){
	cout<<"struct A,c="<<a.c<<"\n";
}

int A::b=2;

int main(){
    A a(3);
    cout<<"a="<<a.a<<",b="<<A::b<<"\n";
    a.show();
    showC(a);
	return 0;
}

2、继承

    struct一样支持多态,单继承,多继承,公有/私有/保护继承,同class的区别是,struct默认是公有继承,而class默认是私有继承,如下示例:

#include <iostream>

using std::cout;

struct A{
	virtual ~A(){};
	virtual void show(){cout<<"show A\n";};
};

struct B:A{
	void show(){cout<<"show B\n";};
};

struct C{
	void showC(){cout<<"show C\n";};
};

struct D:private B,C{
	void showD(){cout<<"show D\n";};
};


int main(){
    B b;
    A * a=&b;
    a->show();

    D d;
    d.showC();
    d.showD();
    B * d2=(B*)&d;
    d2->show();

	return 0;
}


3、模板

     struct同class一样可以定义模板,可以作为模板参数,注意模板定义中可以用typename代替class,但不能用struct代替class,如下示例:

#include <iostream>
#include <string>

#define TEMP template <class T1, class T2,int typeNum>

TEMP
struct Pair
{
private:
    T1 a;
    T2 b;
    int type=typeNum;
public:
    T1 & first();
    T2 & second();
    T1 first() const { return a; }
    T2 second() const { return b; }
    int getType() const { return type; }
    Pair(const T1 & aval, const T2 & bval) : a(aval), b(bval) { }
    Pair() {}
};

TEMP
T1 & Pair<T1,T2,typeNum>::first()
{
    return a;
}

TEMP
T2 & Pair<T1,T2,typeNum>::second()
{
    return b;
}

struct A{
	int getA(){return 3;};
};


int main()
{
   Pair<int ,std::string,11> a(1,"test");
   std::cout<<"first:"<<a.first()<<",second:"<<a.second()<<",type:"<<a.getType()<<"\n";

   Pair<A,std::string,12> b(A(),"test2");
   std::cout<<"first:"<<b.first().getA() <<",second:"<<b.second()<<",type:"<<b.getType()<<"\n";
   return 0;
}