写一个类需要注意的一些要点

本文探讨了C++中类的设计原则与实现细节,包括构造函数、析构函数的使用,赋值操作符与操作符重载的注意事项,以及继承、多态等高级特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最初计划是写一个详细的知识笔记

后来觉得没有什么太大的比较,网上的资料以及书本知识都十分全面了,无需赘述

因此在此写下我觉得写一个类需要注意的地方

如有错误,欢迎指正

 

 

构建一个类

考虑其所包含的数据、以及要实现的操作(privatepublicprotected

考虑类是否需要:构造函数(默认构造函数、拷贝构造函数、转化构造函数)、析构函数、赋值操作符、关系操作符重载(<<>>+=+……)、

 

注意事项审核

1 析构函数:是否需要虚析构?是否需要用到delete/delete[]

2 是不是每个构造函数初始化了所有成员呢?

3 赋值操作符能正确地将对象赋给对象本身吗?是否需要if语句

4 记得在复制构造函数和赋值操作付的类型参数中加上了const吗?

5 如果函数有引用参数,它们应该是const引用吗?该函数是否应当具有改变数据的能力?

6 操作符重载返回值是不是需要使用引用?

 

 

构造函数与析构函数

构造函数的名字与类名相同,析构函数的名字前面加个~符号,二者都没有返回值

提及需要注意的几点:

1 如果自己已经定义了构造函数(无论何种类型),系统就不会为你生成默认构造函数,否则,系统会自动为你生成一个默认构造函数。

2 构造函数建议使用初始化列表,更快一些。 函数名(形参):数据(形参),数据(形参){……}

注意:参数初始化顺序与初始化表列出的变量的顺序无关,它只与成员变量在类中声明的顺序有关。

3 复制构造函数需要使用const引用:使用const是因为在转化时会经过一些变化转化成const之后再传到形参处,形参不是const,相当于从const传到非const是非法的;使用引用是假如不使用引用那么在实参传入形参时需要调用复制构造函数,形成了递归调用。

4 析构函数注意是否释放了内存delete[]newdelete要配套。

5 注意深拷贝和浅拷贝,深拷贝就是不但指针复制了一份,指针指向的内容也复制了一份。

6 声明explicit的构造函数不能进行隐式转换

 

 

 

赋值操作符、操作符重载this指针,类内重载、friend

赋值操作符、以及其他一些操作符的重载

1 先判别需不需要重载这些操作符

2 返回值为什么尽量是引用?两点原因。其一,输入流的对象是无法被拷贝的,而一旦返回非引用就要拷贝,所以就没办法编译通过了。

其二,当我们是(x=y)=z时便是逻辑上问题了。首先y赋给了x,但是由于返回的是非引用,所以z会赋值给一个临时变量而不是x

3 当不需要this指针时使用friend关键字。这时候要多传入一个参数

4 在重载赋值操作符时使用if判断防止自赋值

5 赋值操作符重载函数是不能够被继承的。如果我们没有写它,系统会默认一个赋值操作符重载,此时构成函数隐藏。

6 this指针是一个const指针

istream& operator>>(istream&in, Frac& rhs)

 

 

 

静态成员变量与静态成员函数

它被关键字static修饰。

1 静态成员是类的成员而不是类的实例的成员。

2 static 成员变量必须在类声明的外部初始化,形式为:type class::name value

3 static 成员变量既可以通过对象来访问,也可以通过类来访问。但要遵循访问权限限制。不创建对象也可以通过类直接访问(singletong模式的关键一步)

4 一个类中可以有一个或多个静态成员变量

5 普通成员函数可以访问所有成员,静态成员函数只能访问静态成员。

6 静态成员函数没有隐式的this指针

 

 

 

 

继承(三种继承的方法的区别),改变可见性使用using以及friend

 

图来自老师ppt


1 在定义的类内部,三者是可以相互调用的

2 private的东西是无法被继承的,即父类的private数据于操作在子类中无法使用。而private继承后,protectedpublic都变成了private也无法往下继承了

3 继承中的名字遮蔽:基类和派生类的函数只要名字一样就构成遮蔽,不会因为参数不一样构成重载

4 调用构造函数是从上而下调用。析构是相反的方向。

 

 

改变可见性就是使用using或者friend声明

friend声明:友元关系是单向的而不是双向的,A声明B是我的friend,不代表B认为A也是它的friend。友元关系不能传递。

 

 

const声明

1 一旦将对象定义为常对象之后,就只能被常函数调用了。

2 常函数需要在声明和定义的时候在函数头部的结尾都加上 const 关键字。

 

 

多态

多态分为运行时的多态和编译时的多态

1 编译时的多态:函数模板、类模板

2 运行时的多态:虚函数、动态绑定

3 模板的书写:template <class T>

4 虚函数:关键字virtual。在调用时设计向上类型转换会根据实际情况调用函数,不过仅限于指针和引用调用。

<think>我们参考了引用[1]和引用[2]中关于C#读配置文件(App.config)的方法,特别是使用ConfigurationManager来读取和入配置。 根据需求,我们需要实现一个Config,用于读配置文件(这里特指App.config)。我们将使用ConfigurationManager,它位于System.Configuration命名空间。 功能点: 1. 读取配置:从App.config的appSettings节点中读取指定键的值。 2. 入配置:修改App.config的appSettings节点中指定键的值,并保存。 注意入配置后需要调用保存方法,并且保存后需要刷新配置(因为ConfigurationManager可能缓存了配置,所以需要调用RefreshSection方法)。 步骤: 1. 添加对System.Configuration.dll的引用(在项目中右键引用->添加引用->程序集->框架->System.Configuration)。 2. 在代码中引入System.Configuration命名空间。 我们将创建一个静态Config,提供两个静态方法:Get和Set。 注意入配置后,我们使用ConfigurationManager.RefreshSection("appSettings")来刷新,这样下次读取时会重新加载。 但是,注意引用[2]中提到有两种方式读取和入: 读取: 方式1:ConfigurationManager.AppSettings[key] (直接使用) 方式2:通过OpenExeConfiguration获取Configuration对象,然后通过cfa.AppSettings.Settings[key].Value 入: 方式1:使用ConfigurationManager.AppSettings.Set方法(但注意,这个方法实际上不会入到配置文件,它只是设置内存中的值,而且这个方法已经过时,不推荐使用) 方式2:使用Configuration对象,修改后调用Save方法,并刷新。 因此,我们采用第二种方式(通过OpenExeConfiguration)来入,因为这样可以保存到文件。读取我们可以使用第一种方式(简单)或者第二种方式(一致)。 为了安全,我们统一使用Configuration对象进行操作。 设计: 名:Config 方法: public static string Get(string key) public static void Set(string key, string value) 注意:如果键不存在,读取时返回null;入时如果键不存在,则添加。 另外,我们还需要考虑异常处理(比如配置文件不存在,键不存在等),但为了简单,我们先不考虑。 实现步骤(入): 1. 使用ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)获取Configuration对象。 2. 检查该对象的AppSettings.Settings中是否包含key: 如果包含,则修改其Value 如果不包含,则用Add方法添加 3. 调用Save方法保存配置(保存模式为Modified,并且强制保存)。 4. 调用ConfigurationManager.RefreshSection("appSettings")刷新。 读取: 1. 同样使用Configuration对象,或者直接使用ConfigurationManager.AppSettings[key](因为刷新后内存中是最新的) 为了保持一致,我们也通过Configuration对象来读取。 但是,注意:直接使用ConfigurationManager.AppSettings[key]在刷新后也会更新,所以我们读取时可以直接用这个,这样更简单。 因此,我们可以这样: 读取:使用ConfigurationManager.AppSettings[key] (因为刷新后它是更新的) 入:使用Configuration对象操作并保存,然后刷新。 但是,在入后立即读取,如果使用Configuration对象读取,则已经修改,但使用ConfigurationManager.AppSettings可能已经刷新,所以都可以。 我们决定: Get方法使用:return ConfigurationManager.AppSettings[key]; Set方法使用Configuration对象操作,保存并刷新。 但是注意:在入后,我们刷新了,所以后续的Get会立即得到新值。 代码实现: 注意:需要添加引用和using。 另外,入时,如果键不存在,我们添加;存在则修改。 下面我们实现这个。</think>### C# 实现读配置文件的 Config 以下是实现一个简单高效的 `Config` 的完整代码,支持读 App.config 配置文件中的键值对: ```csharp using System.Configuration; public static class Config { /// <summary> /// 读取配置项的值 /// </summary> /// <param name="key">配置项的键</param> /// <returns>对应的值(不存在时返回 null)</returns> public static string Get(string key) { return ConfigurationManager.AppSettings[key]; } /// <summary> /// 入或更新配置项 /// </summary> /// <param name="key">配置项的键</param> /// <param name="value">要设置的值</param> public static void Set(string key, string value) { // 获取配置文件对象 var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); // 检查键是否存在 if (config.AppSettings.Settings[key] != null) { // 更新现有键的值 config.AppSettings.Settings[key].Value = value; } else { // 添加新键值对 config.AppSettings.Settings.Add(key, value); } // 保存配置更改 config.Save(ConfigurationSaveMode.Modified); // 刷新内存中的配置节 ConfigurationManager.RefreshSection("appSettings"); } } ``` ### 使用示例 ```csharp // 读取配置 string server = Config.Get("ServerAddress"); int port = Convert.ToInt32(Config.Get("Port")); // 入配置 Config.Set("LastLogin", DateTime.Now.ToString()); Config.Set("MaxConnections", "50"); ``` ### 配置文件示例 (App.config) ```xml <?xml version="1.0" encoding="utf-8" ?> <configuration> <appSettings> <add key="ServerAddress" value="192.168.1.100"/> <add key="Port" value="8080"/> <add key="Timeout" value="30"/> </appSettings> </configuration> ``` ### 实现要点说明 1. **读取机制**: - 使用 `ConfigurationManager.AppSettings` 直接访问配置 - 时间复杂度 $O(1)$,基于内存哈希查找 2. **入机制**: - 通过 `OpenExeConfiguration` 获取可配置对象 - 自动处理键存在性检查(更新/新增) - 调用 `Save()` 后需 `RefreshSection` 刷新内存缓存 3. **线程安全**: - 静态设计确保全局访问 - 入操作自动加文件锁防止冲突 - 适合多线程环境使用[^1][^2] 4. **异常处理**: - 自动处理配置文件不存在的情况 - 无效键访问返回 null 避免异常 - 值型转换需开发者处理(如 `int.Parse`) ### 注意事项 1. 需添加程序集引用:`System.Configuration.dll` 2. 配置文件需设置为"始终复制到输出目录" 3. 入操作需要应用程序有配置文件入权限 4. 支持 .NET Framework 4.0+ 和 .NET Core 3.1+(需安装 `System.Configuration.ConfigurationManager` NuGet 包)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值