讲师中心 微信公众号
AI工具推荐 视频效率加速

C++结构体成员修改与访问权限管理

梦婷姑娘_7470

梦婷姑娘_7470

发布时间:2025-09-12 09:46:01

|

890人浏览过

|

来源于php中文网

原创

结构体成员默认为public,可通过public、private、protected修饰访问权限,其中struct默认公有,class默认私有,友元可访问私有成员,初始化方式包括默认、聚合、构造函数及C++20指定初始化器。

c++结构体成员修改与访问权限管理

C++结构体成员的修改和访问权限管理,简单来说,就是控制谁能读写结构体里的数据。默认情况下,结构体成员都是公有的(public),这意味着任何代码都可以直接访问和修改它们。但有时,我们希望限制这种访问,就需要用到访问修饰符。

解决方案:

C++提供了三种访问修饰符:

public
、
private
和
protected
。

  • public
    : 成员可以在任何地方被访问。
  • private
    : 成员只能在结构体内部被访问。
  • protected
    : 成员可以在结构体内部以及其派生类中被访问。

使用方法很简单,在结构体定义中使用这些修饰符来指定成员的访问权限:

立即学习“C++免费学习笔记(深入)”;

struct MyStruct {
public:
    int publicVar; // 任何代码都可以访问

private:
    int privateVar; // 只能在MyStruct内部访问

protected:
    int protectedVar; // 只能在MyStruct内部和派生类中访问

public:
    void setPrivateVar(int value) {
        privateVar = value; // 结构体内部可以访问private成员
    }

    int getPrivateVar() const {
        return privateVar; // 结构体内部可以访问private成员
    }
};

int main() {
    MyStruct obj;
    obj.publicVar = 10; // OK
    // obj.privateVar = 20; // 错误:privateVar是私有的
    obj.setPrivateVar(20); // OK,通过public方法间接访问private成员
    return 0;
}

为什么要使用访问修饰符?

访问修饰符主要用于封装。封装是面向对象编程的重要概念,它隐藏了对象的内部实现细节,只对外暴露必要的接口。这样做的好处包括:

  • 数据保护: 避免外部代码直接修改结构体内部状态,保证数据的有效性。
  • 代码维护: 当内部实现发生变化时,只要接口不变,外部代码就不需要修改。
  • 提高代码可读性: 明确哪些成员是公开的,哪些是内部使用的,方便理解代码。

结构体和类的区别是什么,访问权限默认值有什么不同?

在C++中,结构体(

struct
)和类(
class
)非常相似,它们都可以包含数据成员和成员函数,并且都可以使用访问修饰符。它们之间最主要的区别在于默认的访问权限:

  • struct
    : 默认情况下,成员的访问权限是
    public
    。
  • class
    : 默认情况下,成员的访问权限是
    private
    。

这意味着,如果你在一个结构体中没有指定访问修饰符,那么它的所有成员都是可以公开访问的。而在一个类中,如果你没有指定访问修饰符,那么它的所有成员都是私有的。

这个区别主要是为了向C语言兼容,因为C语言中只有结构体,没有类。C++保留了结构体,并赋予了它面向对象的能力,但为了兼容性,保留了其默认的public访问权限。

如何在结构体中使用友元函数或友元类来访问私有成员?

有时候,我们希望允许某些函数或类访问结构体的私有成员,但又不想把这些成员变成公有的。这时,可以使用友元(friend)机制。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

友元函数或友元类可以访问结构体的

private
和
protected
成员,即使它们不是结构体内部的成员。

struct MyStruct {
private:
    int privateVar;

public:
    MyStruct(int value) : privateVar(value) {}

    friend void friendFunction(MyStruct& obj); // 友元函数
    friend class FriendClass; // 友元类
};

void friendFunction(MyStruct& obj) {
    obj.privateVar = 100; // 友元函数可以访问private成员
}

class FriendClass {
public:
    void modify(MyStruct& obj) {
        obj.privateVar = 200; // 友元类可以访问private成员
    }
};

int main() {
    MyStruct obj(10);
    friendFunction(obj);
    FriendClass fc;
    fc.modify(obj);
    return 0;
}

在这个例子中,

friendFunction
和
FriendClass
都被声明为
MyStruct
的友元。这意味着它们可以访问
MyStruct
的
privateVar
成员。

什么时候应该使用结构体,什么时候应该使用类?

这是一个常见的问题,没有绝对的答案,但有一些指导原则:

  • 数据聚合: 如果你的主要目的是将一些相关的数据组合在一起,而不需要复杂的行为,那么可以使用结构体。例如,表示一个点的坐标 (x, y),或者表示一个人的姓名、年龄和地址。
  • 轻量级对象: 如果你需要创建一些轻量级的对象,并且希望避免类带来的额外开销,那么可以使用结构体。
  • 与C代码兼容: 如果你需要与C代码进行交互,并且C代码需要访问你的数据,那么可以使用结构体,因为C语言中没有类。
  • 封装和继承: 如果你需要实现复杂的封装和继承关系,那么应该使用类。类提供了更多的特性,例如访问修饰符、构造函数、析构函数、虚函数等,可以更好地支持面向对象编程。

总的来说,如果你的对象只需要存储数据,并且不需要复杂的行为,那么可以使用结构体。否则,应该使用类。

结构体成员的初始化方式有哪些?

C++提供了多种结构体成员的初始化方式:

  1. 默认初始化: 如果没有显式地初始化结构体成员,那么它们会被默认初始化。对于基本类型,例如

    int
    、
    float
    等,它们的默认值是不确定的。对于类类型的成员,会调用它们的默认构造函数。

    struct MyStruct {
        int x;
        double y;
    };
    
    MyStruct obj; // x和y的值是不确定的
  2. 聚合初始化: 如果结构体没有用户定义的构造函数、私有或受保护的非静态数据成员、基类或虚函数,那么可以使用聚合初始化。

    struct MyStruct {
        int x;
        double y;
    };
    
    MyStruct obj = {10, 3.14}; // 聚合初始化
  3. 构造函数初始化: 可以定义构造函数来初始化结构体成员。

    struct MyStruct {
        int x;
        double y;
    
        MyStruct(int xValue, double yValue) : x(xValue), y(yValue) {}
    };
    
    MyStruct obj(10, 3.14); // 构造函数初始化
  4. 指定初始化器 (C++20): C++20 引入了指定初始化器,可以按名称初始化结构体成员。

    struct MyStruct {
        int x;
        double y;
    };
    
    MyStruct obj{.x = 10, .y = 3.14}; // 指定初始化器

选择哪种初始化方式取决于你的需求。聚合初始化简单方便,但只能用于简单的结构体。构造函数初始化可以提供更灵活的初始化逻辑。指定初始化器可以按名称初始化成员,提高代码的可读性。

热门AI工具

更多
Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

相关专题

更多
css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

6887

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

804

2025.10.23

go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

6875

2025.09.05

java面向对象
java面向对象

本专题整合了java面向对象相关内容,阅读专题下面的文章了解更多详细内容。

342

2025.11.27

C++ 面向对象编程与设计模式实践
C++ 面向对象编程与设计模式实践

本专题整合了 C++ 面向对象编程的核心机制,涵盖类的定义与访问控制、构造函数与析构函数、拷贝语义与移动语义、继承与虚函数多态、抽象类与接口、运算符重载、友元函数等关键知识点,同时结合单例模式、工厂模式、观察者模式、策略模式等常用设计模式的 C++ 实现,帮助开发者写出结构清晰、易于维护的面向对象代码。

364

2026.04.09

Java 面向对象与核心编程机制
Java 面向对象与核心编程机制

系统讲解 Java 面向对象编程的核心知识体系,涵盖类的定义与封装、构造方法与 this/super 关键字、继承与方法重写、多态与向上向下转型、抽象类与接口的区别与设计原则、异常处理机制(try-catch-finally / 自定义异常)、泛型的类型参数与通配符、集合框架(List/Set/Map)的使用与遍历方式,帮助开发者全面掌握 Java 程序设计的核心机制与面向对象思维。

243

2026.04.17

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

4934

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

5091

2025.07.04

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

100

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Linux网络安全之防火墙技术汇总
Linux网络安全之防火墙技术汇总

共31课时 | 4.2万人学习

Servlet基础教程
Servlet基础教程

共24课时 | 31.8万人学习

PHP零基础通关宝典
PHP零基础通关宝典

共78课时 | 13.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn