c++ struct和class的用法总结
程序员文章站
2022-04-28 19:29:21
...
由于自己是直接系统学习的c++,所以对struct的用法还是很模糊,感觉它就是不如class,但是具体有哪些不同,除了知道默认访问权限不同,就不知道别的,所以还是有必要总结一番。
1、c和c++中struct的区别
c中的struct没有成员函数,而c++中的struct是对c中的struct进行了扩充,所以增加了很多功能,可以说跟class已经有很多相似之处。且在c中使用结构体时需要加上struct,或者对结构体使用typedef取别名,而c++可直接使用。
//结构体声明,C和C++使用同一个
struct Student
{
int iAgeNum;
string strName;
}
typedef struct Student Student2;//c中取别名
struct Student stu1; //c中正常使用
Student2 stu2; //c中通过取别名的使用
Student stu3; //c++使用
由于c和c++语言的特点,在c中结构体就是不同类型数据的集合,并不涉及算法和操作,而c++是把数据变量及对这些数据变量的相关算法和操作给封装起来。
1、c++中struct和class的区别
a. struct默认的访问属性是public,而class默认的访问属性是private。
struct A
{
int num;
};
class B
{
int num;
};
int main()
{
A a;
a.num = 2; //没有问题,默认访问属性为public
B b;
b.num = 2; //编译出错,默认访问属性为private
return 0;
}
b. 在继承关系中,struct默认是public的,而class是private,不过不建议这样写,一般都是写明继承的方式。
struct A
{
int aNum;
};
struct B : A
{
int bNum;
};
class B : public A{};
struct B : public A{};
int main()
{
A a;
a.aNum = 1; //在struct情况下是正确的,在class情况下是错误的
return 0;
}
c. class这个关键字还可用于定义模板参数,就像typename,但是strcut不用与定义模板参数。
template< typename T, typename Y > //可以把typename换成class
int Func( const T& t, const Y& y )
{
//TODO
}
d. 赋初值问题,c中对struct赋初值可以用{}的形式,而在c++中的class则不行,需要调用构造函数。(所以说,加入一个构造函数或是一个虚函数会使strcut更体现出一种对象的特性)
struct A
{
char c1;
int i2;
double db3;
};
A a = {'p', 7, 451.154}; //定义时赋初值,在struct时没问题,在class时出错
总结:什么时候用struct,什么时候用class呢?
如果更像是一种数据结构集合的话,那么用struct(比如一个基函数,里面只需要几个变量的那种),如果你要做的更像是一种对象的话,那么用class(里面涉及到成员变量、构造函数、析构函数等)。