首页
学习
活动
专区
工具
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++中constconst对象分别调用constconst成员函数

一、先来提出问题 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.3K20

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

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

25330
  • 【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 表示修饰数据是常量 , 数据不可更改 ; 如果想要修改 常量指针 指向内存中数据 , 要使用

    38110

    C++11 利用const_casttype_traits修改类成员常量通用模板函数

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

    53040

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

    代码风格 前面去了解vector源码,发现大部分头文件都会使用这种方式来避免被重复导入代码 #ifndef XXX_H #define XXX_H 1 code......这可能也公司有关系,java公司oracle毕竟是搞商业(还是要恰饭),包括一些jdk都是收费,所以有些高权限代码也不想给扩展看到。...如下代码,是使用static通过枚举定义类里面的静态成员两种方式。同时,cpp限制了static成员,如果要在定义时初始化,则必须是const修饰。...const方法中,不能修改对象成员(即static成员),同时不能调用thisconst方法,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了。

    76830

    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 也可以接受一个数组作为参数。该数组成员是一个个表示键值对数组。

    66010

    STL 总结与常见面试题

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

    89130

    STL总结与常见面试题

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

    3.6K98

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

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

    56320

    STL总结与常见面试题

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

    67430

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

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

    34410

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

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

    19130

    读完某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)认识实际应用经验

    10310

    ES6入门之Set Map

    Set 1.1 基本用法 Set 类似于数组,但是成员 值都是唯一,没用重复值。Set本身是一个构造函数,用来生成Set数据结构。...] // [1,2,3,4,5] // 实例二 const items = new Set([1,2,3,3,4]) items.size // 4 // 上面代码还展示了数组去重方法 [......Set 如何判断一个键区别 // 对象 const p = { 'w': 1, 'h': 2 } if(p[a]){ no } // Set const p = new Set...WeakSet WeakSet 结构与Set类似,也不是重复集合,但是Set有两个区别,第一个它成员只能为对象,另一个它对象都是弱印象,即垃圾回收机制不考虑 WeakSet对该对象引用,通俗讲就是...2.1 语法 它也是一个构造函数,可以通过 new 来创建 const ws = new WeakSet() // 做为构造函数,WeakSet 可以接受一个数组或类似数组对象作为参数,该数组所有成员

    40010

    从入门到精通:如何解决C++模板代码膨胀问题?

    现代编译器已经能够对不同编译单元里相同模板函数进行去重,老生常谈 external 模板、将模板代码模板代码分离等,对瘦身意义已经不大,我们仍然需要关注如何减少每一个模板实例化大小。...将模板函数通用部分提取出来 如果模板函数中有一部分代码与模板参数无关,那么可以将这部分代码提取出来,放到一个模板函数中。这样,这部分代码只需要生成一次,而不是在每个模板实例中都生成一次。...❞ 编译器每实例化一个模板类,会将类所有部分都复制一份,包括模板成员变量、模板成员变量、模板函数、模板函数。尤其是「模板成员变量模板函数,也会复制生成一份」,即使它们没有用到模板信息。...Service 都继承自 TLBussinessServiceBase static ServiceCenter g_tlServiceCenter; 2.1 将模板成员变量模板函数提取到基类...例如,假设现在有如下子类基类,T 实例个数是 n,U 实例个数是 m,那么子类每个成员变量成员函数都会「生成 n*m 份」;如果把子类里只与 T 相关成员挪到基类,那么这些成员「只会生成 n

    57010

    C++:31---对象引用赋值

    是,如果我们显示地要求编译器生成=default移动操作,且编译器不能移动所有成员,则编译器会将移动操作定义为删除函数 何时将合成移动操作定义为删除函数遵循与定义删除合成拷贝操作类似的原则:...) ②如果有类成员移动构造函数或移动赋值运算符被定义为删除或是不可访问,则类移动构造函数或移动赋值运算符被定义为删除类似拷贝构造函数,如果类析构函数被定义为删除或不可访问,则类移动构造函数被定义为删除...④类似拷贝赋值运算符,如果有类成员const或是引用,则类移动赋值运算符被定义为删除 移动操作和合成拷贝控制成员之间还有最后一个关系: 一个类是否定义自己移动操作对拷贝构造函数如何合成有影响...当rhs离开作用域后,这个对象将会销毁 九、右值引用成员函数 除了构造函数赋值运算符之外,成员函数也可能提供两个版本:一个提供拷贝,另一份通过移动 一份提供拷贝:参数为const& 一份提供移动:参数为...,引用限定符只能作用于(static)成员函数,且在声明定义时都需要 引用限定符可以const一起使用,且const必须在限定符前面。

    1.7K10

    es6 -- set 数据结构

    ES6 提供了新数据结构 Set。它类似于数组,但是成员值都是唯一,没有重复值。 Set 本身是一个构造函数,用来生成 Set 数据结构。...(i); } // 2 3 5 4 上面代码通过add方法向 Set 结构加入成员,结果表明 Set 结构不会添加重复值。...(div)); set.size // 56 上面代码中,例一例二都是Set函数接受数组作为参数,例三是接受类似数组对象作为参数。...上面代码也展示了一种去除数组重复成员方法。 // 去除数组重复成员 [...new Set(array)] 向 Set 加入值时候,不会发生类型转换,所以5"5"是两个不同值。...delete(value):删除某个值,返回一个布尔值,表示删除是否成功。 has(value):返回一个布尔值,表示该值是否为Set成员。 clear():清除所有成员,没有返回值。

    37230
    领券