本篇内容介绍了“C++中的struct和class的区别是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
差异特性 | struct | class |
---|---|---|
成员访问范围 | 默认public | 默认private |
继承关系访问范围 | 默认public | 默认private |
{}初始化 | 1、纯数据或纯数据+普通方法的结构体支持;2、带构造函数或虚方法的结构体不支持 | 不支持 |
struct Person {
int age;
}
Person person = new Person();
person.age = 12;
可以正常的编译和执行。
class Person {
int age;
}
Person person = new Person();
person.age = 12; // 编译出错,应改为public int age;
【扩展】如果不增加public关键字,又想在某个类如ClassA中能访问到这个Person类中的成员,可以通过友元类(friend class Xxx)来将Person中的private和protected的成员共享出去。
Person类可以这么编写:
struct Person {
friend class ClassA;
int age;
}
Person person = new Person();
person.age = 12;
在ClassA中,就可以访问Person中的所有成员了。
void ClassA:setAge() {
Person *person = new Person();
person->age = 12;
}
指的是子对象是否可访问到父对象中的成员。
struct SBase {
public:
int age = 0;
SBase() = default;
virtual ~SBase() = default;
};
struct Person : SBase {
public:
Person() = default;
virtual ~Person() = default;
};
int main(int argc, const char **argv)
{
Person* child = new Person();
child->age = 1;
fprintf(stdout, "test: age=%d\n", child->age);
}
访问正常:
class CBase {
public:
int age = 0;
CBase() = default;
virtual ~CBase() = default;
};
struct Person : CBase {
public:
Person() = default;
virtual ~Person() = default;
};
int main(int argc, const char **argv)
{
Person* child = new Person();
child->age = 1;
fprintf(stdout, "test: age=%d\n", child->age);
}
访问正常。
class CBase {
public:
int age = 0;
CBase() = default;
virtual ~CBase() = default;
};
struct Person : private CBase {
public:
Person() = default;
virtual ~Person() = default;
};
int main(int argc, const char **argv)
{
Person* child = new Person();
child->age = 1;
fprintf(stdout, "test: age=%d\n", child->age);
}
编译错误:不可访问。
class CBase {
public:
int age = 0;
CBase() = default;
virtual ~CBase() = default;
};
class Person : CBase {
public:
Person() = default;
virtual ~Person() = default;
};
int main(int argc, const char **argv)
{
Person* child = new Person();
child->age = 1;
fprintf(stdout, "test: age=%d\n", child->age);
}
编译错误:不可访问。
class CBase {
public:
int age = 0;
CBase() = default;
virtual ~CBase() = default;
};
class Person : public CBase {
public:
Person() = default;
virtual ~Person() = default;
};
int main(int argc, const char **argv)
{
Person* child = new Person();
child->age = 1;
fprintf(stdout, "test: age=%d\n", child->age);
}
访问正常。
struct SBase {
public:
int age = 0;
SBase() = default;
virtual ~SBase() = default;
};
struct Person : SBase {
public:
Person() = default;
virtual ~Person() = default;
};
int main(int argc, const char **argv)
{
Person* child = new Person();
child->age = 1;
fprintf(stdout, "test: age=%d\n", child->age);
}
访问正常。
struct SBase {
public:
int age = 0;
SBase() = default;
virtual ~SBase() = default;
};
struct Person : public SBase {
public:
Person() = default;
virtual ~Person() = default;
};
int main(int argc, const char **argv)
{
Person* child = new Person();
child->age = 1;
fprintf(stdout, "test: age=%d\n", child->age);
}
访问正常。
【总结】
1)子为class的,要想访问到父的public成员,需要加public关键字,即class: public xxx
2)子为struct,可加可不加public,都能访问到父类/结构体的成员
struct StructA {
void send();
int a;
long b;
string str;
};
void StructA::send()
{
fprintf(stdout, "StructA: sending...\n");
}
int main(int argc, const char **argv)
{
StructA aS = {12, 34, "a test"};
aS.send();
fprintf(stdout, "StructA: a=%d, b=%ld, str=%s\n", aS.a, aS.b, aS.str.c_str());
}
可直接用{}初始化数据:
struct StructA {
void send();
int a;
long b;
string str;
StructA();
};
void StructA::send()
{
fprintf(stdout, "StructA: sending...\n");
}
int main(int argc, const char **argv)
{
StructA aS = {12, 34, "a test"};
aS.send();
fprintf(stdout, "StructA: a=%d, b=%ld, str=%s\n", aS.a, aS.b, aS.str.c_str());
}
编译失败:
struct StructA {
void virtual send();
int a;
long b;
string str;
};
void StructA::send()
{
fprintf(stdout, "StructA: sending...\n");
}
int main(int argc, const char **argv)
{
StructA aS = {12, 34, "a test"};
aS.send();
fprintf(stdout, "StructA: a=%d, b=%ld, str=%s\n", aS.a, aS.b, aS.str.c_str());
}
编译失败:
class ClassA {
int a;
long b;
string str;
};
int main(int argc, const char **argv)
{
ClassA cA = {12, 34, "a test"};
}
编译失败:
“C++中的struct和class的区别是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。