首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何删除类似const和非const成员函数之间的代码重复?

在编写具有相似功能和结构的代码时,删除const和非const成员函数之间的代码重复可以提高代码的简洁性和可读性。以下是一些建议:

1. 重命名重复的成员函数

对于重复的成员函数,考虑对其进行重命名。保持命名一致性对于可读性至关重要。例如,重命名printNumberprintNumberCommon

代码语言:cpp
复制
#include<iostream>

void printNumberCommon(int number) 

void printNumber(int number) 

2. 使用嵌套函数

为了实现代码复用,可以创建一个嵌套函数。嵌套函数可以在constnon-const版本调用共享逻辑。

代码语言:cpp
复制
#include<iostream>

void printNumber(int number) 

void printCommon(int number) 

3. 使用if语句判断类型

对于const和non-const参数,可以使用if语句根据参数类型执行自定义逻辑,从而避免重复。

代码语言:cpp
复制
#include<iostream>

void printCommon(int number) 

void printNumber(int number)  else 
}

对于复杂度更高的结构、重复出现更多的成员函数,可以考虑使用更高级的编程技巧(如模板元编程)。但是这些方法需要对编程技能有较高的要求。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++中const和非const对象分别调用const和非const成员函数

一、先来提出问题 const对象可以调用非const成员函数吗? 非const对象可以调用const成员函数吗? const成员函数内可以调用其它的非const成员函数吗?...非const成员函数内可以调用其他的const成员函数吗?...5、const成员函数不能调用非const成员函数 6、非const成员函数可以调用非const成员函数 我们知道c++在类的成员函数中还会隐式传入一个指向当前对象的this指针,所以在test类中,...test* this,即这时会出现类型不匹配的错误,在visual studio 中会出现类似于下面的错误: 4 所以通过上面的说明,我们知道了为什么const 对象不能调用非const成员函数。...* this; 是和void print() const;中this指针的类型是一样的,所以常量对象可以调用const成员函数。

1.4K20

C++中的const成员变量和成员函数

在类中,如果你不希望某些数据被修改,可以使用const关键字加以限定。const 可以用来修饰成员变量和成员函数。...const成员变量 const 成员变量的用法和普通 const 变量的用法相似,只需要在声明时加上 const 关键字。...const成员函数(常成员函数) const 成员函数可以使用类中的所有成员变量,但是不能修改它们的值,这种措施主要还是为了保护数据而设置的。const 成员函数也称为常成员函数。...需要强调的是,必须在成员函数的声明和定义处同时加上 const 关键字。...char *getname() const和char *getname()是两个不同的函数原型,如果只在一个地方加 const 会导致声明和定义处的函数原型冲突。

30930
  • C++新旅程:类的拷贝构造函数 、赋值运算符重载 和const成员函数

    C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。...成员函数将const修饰的“成员函数”称之为const成员函数。...通过调试我们可以知道const对象可以调用const成员函数;非const对象可以调用非const成员函数。...这属于权限的平移const对象可以调用非const成员函数吗?可以,权限的缩小非const对象可以调用const成员函数吗?不可以,权限的放大const成员函数内可以调用其它的非const成员函数吗?...可以,权限的缩小非const成员函数内可以调用其它的const成员函数吗?不可以,权限的放大一句话总结权限不能被放大!!!4.

    8210

    【C++】类型转换 ⑤ ( 常量和非常量之间的类型转换 - 常量类型转换 const_cast | const 左数右指原则 | 代码示例 )

    【C++】类型转换 ④ ( 子类 和 父类 之间的类型转换 - 动态类型转换 dynamic_cast ) 中 , 分析 C++ 环境下 使用 各种方式 进行 父类 和 子类 类型之间的转换 , 推荐使用...动态类型转换 dynamic_cast ; 本博客中 , 介绍 常量和非常量 之间的类型转换 , C++ 中推荐使用 常量类型转换 const_cast ; 一、const 关键字简介 1、const...非指针类型 ) 的常量 const 在 类型左右 都是相同的 const int a = 10; int const b = 20; 2、const 修饰指针 ( 左数右指原则 | 指针常量...但是 , 指针指向的内存中的数据可以修改 int* const e = (int*)malloc(10); 二、常量和非常量 之间的类型转换 - 常量类型转换 const_cast 1、常量类型转换..., 先将 常量 转为变量 , 然后再进行修改 ; 在下面的代码中 , const char * p 表示修饰的数据是常量 , 数据不可更改 ; 如果想要修改 常量指针 指向的内存中的数据 , 要使用

    47110

    C++11 利用const_cast和type_traits修改类成员常量的通用模板函数

    下面的代码利用C++11中的type_trait(类型萃取)将代码简化为两行,其基本原理是通过指向常量的引用来修改常量的内容 const int c = 21; //下面两行代码实现修改常量c auto...我们可以把上面的代码写成一个通用的模板函数。。。。以后只要调用模板函数就成了,就可以把代码简化为1行。...(new_value); ref_var=std::move(ref_new);// 转为右值,以适合比如unique_ptr这种不提供复制操作符的对象 } //在 gcc5和vs2015...(u1,u2);//修改对象常量 modify_const只是在C++语法上实现了修改const修饰的常量,其实只对类成员常量以及非基本类型的局部常量有效,对于函数局部基本类型常量修改是无效的。...对于全局常量或类的静态常量成员,因为位于程序的常量存储区,受CPU指令级的内存保护(只读),所以是不能被修改的,虽然修改全局常量或类成员静态常量的代码也能编译通过,但实际运行时会抛出内存访问冲突的异常。

    54340

    【C++】踏上C++学习之旅(九):深入“类和对象“世界,掌握编程的黄金法则(四)(包含四大默认成员函数的练习以及const对象)

    前言 在我们前面学习到了"类和对象"的四大默认成员函数(构造函数、析构函数、拷贝构造函数、赋值运算符重载),这四大默认成员函数也是我们在以后使用"类和对象"这块知识时经常遇到的。...本章将会围绕着如何实现一个Date类,来让大家尽快学会编写和更加深刻理解关于"类"封装的思想在实际当中的应用! 本文会分板块逐一讲解,在文章的末尾放有本次实现Date类的全部源码。 1....成员 将const修饰的“成员函数”称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改 #include非const对象可以调用const成员函数吗? 可以,因为权限被缩小了。 const成员函数内可以调用其它的非const成员函数吗?...不可以,因为权限被放大了 非const成员函数内可以调用其它的const成员函数吗? 可以,因为权限被缩小了。

    5400

    踏入 C++ 的深邃世界:实现 unordered_set 与 unordered_map 的优雅之旅

    本篇文章将详细讲解如何使用 C++ 模板实现 HashTable 类,并基于该类构建 unordered_set 和 unordered_map,同时深入分析每个成员函数及其实现细节。...☎️一、改造HashTable 改造HashTable以适配unordered_map和unordered_set容器,主要涉及到如何根据这两种容器的特性来设计和实现HashTable节点的存储以及相应的操作...它通过遍历链表节点 _node 和跳转到非空桶位置,实现无序遍历。通过重载操作符,它具备了和标准迭代器类似的操作功能。...跳转到下一个非空桶: 若当前链表遍历完毕,通过哈希函数定位到当前元素所在的桶 hashi。 自增 hashi,开始查找下一个非空桶的位置。...结语 通过实现 HashTable 以及基于它构建 unordered_set 和 unordered_map,我们不仅深入了解了哈希表的基本操作和冲突解决方法,还学习了如何使用 C++ 模板和仿函数来设计通用数据结构

    11410

    C++ 类的不同构造与三种引用

    代码风格 前面去了解vector的源码,发现大部分头文件都会使用这种方式来避免被重复导入代码 #ifndef XXX_H #define XXX_H 1 code......这可能也和公司有关系,java的公司oracle毕竟是搞商业的(还是要恰饭的),包括一些jdk都是收费的,所以有些高权限的代码也不想给扩展和看到。...如下代码,是使用static和通过枚举定义类里面的静态成员的两种方式。同时,cpp限制了static成员,如果要在定义时初始化,则必须是const修饰的。...const方法中,不能修改对象成员(即非static成员),同时不能调用this的非const方法,const修饰的方法可以理解为,不会对对象造成破坏。...拷贝构造函数的定义如下,类似构造函数,而形参是一个同类对象的const左值引用,在没有重写时,默认会有一个自动生成的拷贝构造函数,对所有对象成员进行浅拷贝。

    2.3K10

    Lambda表达式用法超详细整理!!!

    Lambda我们可以将其理解为一个未命名的内联函数。 与任何函数类似,一个lambda具有一个返回类型,一个参数列表和一个函数体。 但与函数不同,lambda可能定义在函数内部。...注意:捕获列表只用于局部非static变量,lambda可以直接使用局部static变量和它所在函数之外声明的名字 完整的biggerd代码: #include #include...//再删除重复元素之前,需要先进行排序 sort(words.begin(), words.end()); //把重复元素移到尾部 auto new_end = unique(words.begin...函数体内可以使用Lambda所在类中的成员变量。 5、a。将a按值进行传递。按值进行传递时,函数体内不能修改传递进来的a的拷贝,因为默认情况下函数是const的。...是因为由lambda产生的类中的函数调用的运算符是一个const成员函数。如果lambda被声明为可变的,则调用运算符就不是const的了。

    84230

    Set 和 Map 数据结构

    # Set 和 Map 数据结构 # Set # 基本用法 ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。...(i); } // 2 3 5 4 上面代码通过add()方法向 Set 结构加入成员,结果表明 Set 结构不会添加重复的值。...(div)); set.size // 56 上面代码中,例一和例二都是Set函数接受数组作为参数,例三是接受类似数组的对象作为参数。...上面代码也展示了一种去除数组重复成员的方法。 // 去除数组的重复成员 [...new Set(array)] 上面的方法也可以用于,去除字符串里面的重复字符。...上面的例子展示了如何向 Map 添加成员。作为构造函数,Map 也可以接受一个数组作为参数。该数组的成员是一个个表示键值对的数组。

    68310

    STL 总结与常见面试题

    所有STL容器都附带有自己专属的迭代器,只有容器的设计者才知道如何遍历自己的元素。原生指针(native pointer)也是一种迭代器。 仿函数:行为类似函数,可作为算法的某种策略。...STL 具有高可重用性,高性能,高移植性,跨平台的优点。 高可重用性:STL 中几乎所有的代码都采用了模板类和模版函数的方式实现,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。...容器和算法之间通过迭代器进行无缝连接。STL 几乎所有的代码都采用了模板类或者模板函数,这相比传统的由函数和类组成的库来说提供了更好的代码重用机会。...在链表的任何位置进行插入/删除操作都非常快。 ? forward_list的特点: forward_list只提供钱箱迭代器,因此不支持反向迭代器,比如rbegin()等成员函数。...forward_list不提供size()成员函数。 forward_list没有指向最末元素的锚点,因此不提供back()、push_back()和pop_back()。

    91730

    STL总结与常见面试题

    所有STL容器都附带有自己专属的迭代器,只有容器的设计者才知道如何遍历自己的元素。原生指针(native pointer)也是一种迭代器。 仿函数:行为类似函数,可作为算法的某种策略。...STL 具有高可重用性,高性能,高移植性,跨平台的优点。 高可重用性:STL 中几乎所有的代码都采用了模板类和模版函数的方式实现,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。...容器和算法之间通过迭代器进行无缝连接。STL 几乎所有的代码都采用了模板类或者模板函数,这相比传统的由函数和类组成的库来说提供了更好的代码重用机会。...在链表的任何位置进行插入/删除操作都非常快。 forward_list的特点: forward_list只提供钱箱迭代器,因此不支持反向迭代器,比如rbegin()等成员函数。...forward_list不提供size()成员函数。 forward_list没有指向最末元素的锚点,因此不提供back()、push_back()和pop_back()。

    3.7K98

    STL总结与常见面试题+资料

    所有STL容器都附带有自己专属的迭代器,只有容器的设计者才知道如何遍历自己的元素。原生指针(native pointer)也是一种迭代器。 仿函数:行为类似函数,可作为算法的某种策略。...STL 具有高可重用性,高性能,高移植性,跨平台的优点。 高可重用性:STL 中几乎所有的代码都采用了模板类和模版函数的方式实现,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。...容器和算法之间通过迭代器进行无缝连接。STL 几乎所有的代码都采用了模板类或者模板函数,这相比传统的由函数和类组成的库来说提供了更好的代码重用机会。...在链表的任何位置进行插入/删除操作都非常快。 ? forward_list的特点: forward_list只提供钱箱迭代器,因此不支持反向迭代器,比如rbegin()等成员函数。...forward_list不提供size()成员函数。 forward_list没有指向最末元素的锚点,因此不提供back()、push_back()和pop_back()。

    56920

    STL总结与常见面试题

    所有STL容器都附带有自己专属的迭代器,只有容器的设计者才知道如何遍历自己的元素。原生指针(native pointer)也是一种迭代器。 仿函数:行为类似函数,可作为算法的某种策略。...STL 具有高可重用性,高性能,高移植性,跨平台的优点。 高可重用性:STL 中几乎所有的代码都采用了模板类和模版函数的方式实现,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。...容器和算法之间通过迭代器进行无缝连接。STL 几乎所有的代码都采用了模板类或者模板函数,这相比传统的由函数和类组成的库来说提供了更好的代码重用机会。...在链表的任何位置进行插入/删除操作都非常快。 forward_list的特点: forward_list只提供钱箱迭代器,因此不支持反向迭代器,比如rbegin()等成员函数。...forward_list不提供size()成员函数。 forward_list没有指向最末元素的锚点,因此不提供back()、push_back()和pop_back()。

    68130

    【C++篇】手撕 C++ string 类:从零实现到深入剖析的模拟之路

    实现一个简易的 string 类可以帮助我们更好地理解: C++ 中动态内存管理:如何正确地分配与释放内存。 深拷贝与浅拷贝的区别:当对象之间共享资源时,如何避免潜在问题。...因此,const 静态成员变量的值必须在类加载时确定,并且在整个程序运行过程中保持不变。 但是 const 静态成员的值不能在对象实例化时通过构造函数来提供,必须直接在类级别初始化。...5.1.2.3 整型和枚举类型的特殊处理 C++ 允许整型(如 int、char)和枚举类型的 const 静态成员变量在类内部进行初始化。...size_t 是一种整型类型,尽管其大小和符号位取决于平台,但它仍然是整型常量的一种。因此,npos 的初始化类似于前面提到的整型静态成员变量。...这是 C++ 设计者在保证效率和复杂性之间做出的权衡,允许简单类型进行编译时优化,但要求复杂类型在类外显式初始化,以确保其初始化的灵活性和正确性。

    28620

    读完某C++神作,我只记下了100句话

    .*/ */ 是错误的 表示整数、字符和布尔值的算术类型合称为整形。区分类型是因为只有知道某地址值的类型,才能知道需要多少位表示这个变量和如何解释这些位。...应将不修改实参的形参定义为const引用,好处是可以传递字符串字面值(和产生右值的表达式),非const引用反而不灵活。 如果形参是引用,那么他只是实参的别名。...对于list对象应该优先使用list容器特有的成员版本【能添加删除元素】,而不是泛型算法。 简单说,类就是定义了一个新的类型和一个新的作用域。成员访问级别默认私有。...static成员函数没有this形参,可直接访问类的static成员,不能使用非static成员。 静态数据成员属于一个类,而不属于类的各个对象。静态成员函数在所有对象建立之前或删除之后仍然使用。...通过在成员前面加上typename告诉编译器将成员当做类型。泛型代码两个原则:1.模板形参是const引用 2.函数体中只用<比较 模板形参数量自由,可以设定返回值为一个形参。

    1.4K20

    【员工工资册】————大一期末答辩近满分作业分享

    原理: 创建一个数组,填入待查找的名字 通过FindByname函数填入,在之中用strcmp比较 利用结构体打印 Tran函数实现的功能是在展示的时候,将性别代码和部门代码转化成对应的性别和部门。...十三:删除模块(与查找模块类似) 原理: 创建一个数组,填入要删除的名字 通过FindByname函数填入,在之中用strcmp比较 用下一位PeoInform的内容填入 Size–(比如删除最后一位...) 【3】测试功能:按照应发工资排序,输出 【4】添加职工及其工资信息 【5】修改给定职工的工资信息 【6】查看给定职工的工资信息 (看下如何能够对齐)要修改的部分 【7】删除职工 【8】修改职工密码...为保证文档中的代码可读(非二进制形式),遂放弃。 个人总结 本次项目(含报告)大概耗时30小时左右,其中大量的时间在程序的调试和bug的查找中。...[程序和文件之间可以通过结构体成员来搭建联系(上文中思路的反思),具备更多的可调节性] 补全了对(w/w+/a/fseek)的认识和实际应用经验

    11010

    【C++高阶】探索STL的瑰宝 map与set:高效数据结构的奥秘与技巧

    它们以其独特的数据存储和检索方式,为我们提供了高效且有序的键值对存储和集合管理方案 map和set不仅拥有自动排序的特性,还提供了丰富的成员函数和迭代器接口,使得我们可以轻松地对其进行操作和管理。...无论是在算法竞赛中,还是在日常编程中,它们都是不可或缺的工具 我们将从map和set的定义和特性开始,介绍它们的基本用法和常用成员函数。接着,我们将通过示例代码,展示如何在实际编程中使用它们。...,反向迭代器;const迭代器与非const迭代器 函数声明 功能介绍 iterator begin() 返回set中起始位置元素的迭代器 iterator end() 返回set中最后一个元素后面的迭代器...与 map 不同,map 中的键是唯一的,而 multimap 中的键可以重复 multimap中的接口可以参考map,功能都是类似的。...我们需要进一步探索它们的高级用法 学习STL中的容器并不仅仅是为了掌握它们的使用方法。更重要的是,我们要学会如何根据问题的需求选择合适的容器类型,以及如何优化我们的代码以提高程序的性能和可维护性。

    45310

    《Effective C++》读书笔记(4):设计与声明

    例如令返回值为const,即可阻止用户写出“a*b=c”的代码。 3、限制对象值。例如参数像月份这样取值有限,即可使用枚举类或者预先定义一系列函数返回所有月份。...在定义一个新type前考虑以下问题: 新type的对象应该如何被创建和销毁? 对象的初始化和对象的赋值该有什么样的差别?...你的新type需要什么样的转换? 什么样的操作符和函数对此新type而言是合理的? 什么样的标准函数应该驳回? 谁该取用新type的成员?...那么,如果在成员函数与非成员/非友元函数之间抉择,并且两者提供相同的技能,那么非成员/非友元函数能访问的成员变量更少,封装性更强。...*(const Rational& rhs) const; } 当operator*是成员函数时,无法解决这样的代码: Rational r1,r2; ... r1 = 2 * r2; //实质上等于

    20730
    领券