網站首頁 編程語言 正文
1. C++的struct和class的區別
差異特性 | struct | class |
---|---|---|
成員訪問范圍 | 默認public | 默認private |
繼承關系訪問范圍 | 默認public | 默認private |
{}初始化 | 1、純數據或純數據+普通方法的結構體支持;2、帶構造函數或虛方法的結構體不支持 | 不支持 |
1.1 成員訪問范圍的差異
struct
struct Person {
int age;
}
Person person = new Person();
person.age = 12;
可以正常的編譯和執行。
class
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;
}
關于友元類的使用,可見c++論壇:https://cplusplus.com/forum/beginner/147733/
1.1 繼承關系訪問范圍的差異
指的是子對象是否可訪問到父對象中的成員。
struct : struct
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 : class
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);
}
訪問正常。
struct : private class
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 : class
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 : public class
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);
}
訪問正常。
class : struct
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 : public struct
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,都能訪問到父類/結構體的成員
1.3 {}初始化的差異
struct – 純數據+一般方法
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 – 帶構造函數
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 – 帶虛方法
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
class ClassA {
int a;
long b;
string str;
};
int main(int argc, const char **argv)
{
ClassA cA = {12, 34, "a test"};
}
編譯失敗:
2. 拓展 :C和C++的struct的區別
原文鏈接:https://blog.csdn.net/FussyCat/article/details/126227664
相關推薦
- 2023-07-02 jQuery和HTML對某個標簽設置只讀或者禁用屬性的方式_jquery
- 2022-02-18 Ubuntu重啟后nvidia-smi命令報錯NVIDIA-SMI has failed becau
- 2021-12-17 C++基礎概念講述_C 語言
- 2022-10-01 Python+OpenCV實現表面缺陷檢測_python
- 2023-02-23 Rust個人學習小結之Rust的循環_Rust語言
- 2022-04-08 Swift使用表格組件實現單列表_Swift
- 2022-06-08 Spring Cloud Alibaba Nacos 客戶端服務注冊心跳和健康監測
- 2022-07-15 Python中五種實現字符串反轉的方法_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支