静态和动态数据成员

Ø 课程目标:
○ 在高级语言程序设计的基础上,认识软件构造的质量标准与目标,学习软件
          构造的基本过程,从而具备面向质量目标的复杂软件构造方法与能力
○ 深入学习抽象数据类型 ADT 与面向对象编程 OOP
○ 初步掌握面向关键质量目标(可理解性、可维护性、可复用性、健壮性、时
空性能)的软件构造基本技术
○ 了解软件代码重构和面向更复杂软件系统的高级构造技术

ü 程序设计与实现能力:
• 了解软件开发过程中应考虑哪些质量目标
• 掌握面向关键质量目标的软件基本构造技术
• 形成面向质量目标的软件开发思维模式

ü 系统设计与实现能力
• 掌握“面向抽象编程”的核心思想和面向对象软件开发的基本过程
• 能够对实际应用问题进行抽象和建模
• 利用模型与开发者和用户进行有效表达和沟通

ü 系统分析与评价能力
• 从个人编程到团队合作的转换从关注单一开发环节到关注全开发过程的转换
• 根据用户期望质量特性进行全生命周期 系统分析与评价
• 发现系统设计的缺陷并做出优化和改进

ü 利用现代软件构造工具的能力
           • 了解复杂软件系统相对于简单程序的本质差异
           • 初步掌握利用各类软件开发工具进行编码、测试和质量保障
           • 利用现代软件构造工具进行高质量和高效率软件开发
Ø 更好的软件设计
○ 编码前思考
○ 考虑非功能性质量属性,可维护性,可扩展性,性能......
○ 提出建议,考虑设计方案
○ 做出明确的设计决定
○ 使用设计过程- 组织您的工作,构成你的理解, 便于沟通
Ø 学习目标
   能够设计中等规模的课程
   了解OO编程概念和设计决策
   熟练掌握功能性基本质量保证技术的正确性
   并发和分布式系统的基础
   实用技能
### C++ 静态数据成员与普通数据成员的区别及使用场景 #### 区别 1. **所属范围不同** - 普通数据成员属于类的具体实例,即每个对象都有自己独立的一份副本。修改其中一个对象的数据不会影响其他对象中的相同数据成员[^1]。 - 静态数据成员则属于整个类,而不属于任何具体的对象。无论创建多少个对象,静态数据成员只有一份共享的存储空间[^3]。 2. **初始化方式不同** - 普通数据成员通常在构造函数中初始化或者赋值。 - 静态数据成员需要在类外部显式地定义并初始化,即使它的声明已经在类内部完成。例如: ```cpp class Example { public: static int sharedValue; }; // 类外初始化静态成员变量 int Example::sharedValue = 0; ``` 3. **访问方式不同** - 普通数据成员必须通过具体对象来访问,无法直接通过类名访问[^5]。 - 静态数据成员可以通过类名直接访问,也可以通过对象访问,但推荐使用类名访问以体现其全局性质。例如: ```cpp Example ex; std::cout << Example::sharedValue << std::endl; // 推荐做法 std::cout << ex.sharedValue << std::endl; // 不推荐的做法 ``` 4. **生命周期不同** - 普通数据成员随对象的创建而存在,销毁时释放内存。 - 静态数据成员在整个程序运行期间都存在,在第一次被引用时分配内存,并且直到程序结束才释放[^4]。 --- #### 使用场景 1. **静态数据成员适用场景** - 当多个对象之间需要共享某些状态或资源时,可以考虑使用静态数据成员。例如计数器功能,用于统计当前存在的对象数量。 ```cpp class Counter { private: static int count; public: Counter() { ++count; } ~Counter() { --count; } static int getCount() { return count; } }; int Counter::count = 0; void test() { std::cout << "Initial objects: " << Counter::getCount() << std::endl; Counter c1, c2; std::cout << "After creating two objects: " << Counter::getCount() << std::endl; } ``` - 如果某项数据逻辑上应归属于整个类而非单个对象,则适合采用静态数据成员。比如配置参数、默认设置等[^2]。 2. **普通数据成员适用场景** - 表达特定对象的状态信息时,应该选用普通数据成员。因为这些属性仅对该对象有意义,与其他对象无关。 - 如表示一个人的名字、年龄等个性化特征的信息就应当作为普通数据成员处理。 --- #### 示例对比 假设我们设计一个 `Person` 类: - 若希望记录每个人的姓名年龄(每个人都有自己的名字年龄),那么这两个字段应该是普通的非静态成员变量。 - 而如果想跟踪总共创建了多少个人对象,则可以用到静态成员变量实现人数统计的功能。 ```cpp class Person { private: std::string name; int age; static int totalPersonsCreated; // 统计总人数 public: Person(const std::string& n, int a):name(n), age(a){ ++totalPersonsCreated; } static int getTotalPersons(){ return totalPersonsCreated; } }; int Person::totalPersonsCreated = 0; void exampleUsage(){ Person p1("Alice", 25); Person p2("Bob", 30); std::cout << "Total persons created: " << Person::getTotalPersons() << std::endl; } ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值