IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++参数类型的合理选用 -> 正文阅读

[C++知识库]C++参数类型的合理选用

C++参数类型的合理选用

前言

  • 在传统C++中, 函数的参数类型主要有三种: 传值传指针传引用
  • C++11开始,多了一种叫做 右值引用的类型,以及一些智能指针类型(shared_ptrweak_ptrunique_ptr)

各参数类型的最佳适用场景

传值

  • 传值开销 比 传指针和引用开销更小,如: charchar *char &占用内存更小
  • 函数内部明确需要参数的副本

传指针

  • 结构体,体积较大,并且设计到不通类型的地址转换
  • 内存字节操作
  • 参数需要分为空与非空
  • 多个对象内存连续

传引用

  • 单个对象,体积较大
  • 需要对参数对象做修改
  • 函数内明确不能使用空对象

传右值引用

  • 需要将参数对象的所有权转移

传智能指针

  • 需要区分空与非空,并且设计对象生命周期管理的,如:

当参数对象需要共享时,使用 shared_ptr
当参数对象需要独占,只能进行转移时,使用 unique_ptr
参数中不使用 weak_ptr, weak_ptr仅用于共享对象之间的互相引用解决引用环

const约束

  • 当参数明确表示函数内部不会进行修改时,无论是引用类型参数还是指针类型参数,都应该加上 const约束,如:
void funcRef(const Arg& arg)
{
	// 内部不会对arg做任何改动
}

void funcPointer(const Arg *arg)
{
	if (arg == nullptr) {
	} else {
		// 同样不会对arg有任何改动
	}
}

注意:

严格执行必要的参数const约束后会发现,当调用了某些类的成员函数并且这些函数同样不会对自身有任何改动,但却编译不通过。这是为什么呢?

成员函数的const约束

上述问题中的答案其实很简单,因为调用的成员函数虽然没有对成员有改动,但是成员函数并没有标记为const, 没有标记为const的成员函数,只有在对象本身处于非常量状态下才能调用。因此,如果明确表示成员函数不会对成员变量有改动,需要显示的在函数尾部标记为const。如:

class Person {
	explicit Person(const std::string& name):name_(name) {}
	~Person() = default;

	std::string name() const 
	{
		return nane_;
	}
	
	int age() const
	{
		return age_;
	}
private:
	std::string name_;
	int age_ {0};
};

void callPerson(const Person& person)
{
	std::cout << person.name() << ", your turn" << std::endl;
}

常左值引用与右值引用的合并

当某个函数逻辑内部会对参数做副本时,传统做法是使用常引用类型,然后在内部使用拷贝函数显式定义一个副本对象,C++11后,除了要求要写常左值引用版本的参数类型外,还需要实现右值引用版本的参数,保证传入的对象如果是一个右值,则会自动进行移动操作,而不是拷贝

针对上述情况,我们可以将两种情况进行合并,实现一个传值类型的参数版本即可,这样,既可以传左值引用自动拷贝(传值自动拷贝),也可以传右值引用将外部对象直接移动到函数参数内。

将一个右值引用移动到参数上,可以大大减少对象的拷贝开销,增加对象的利用率

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-09-19 07:48:45  更:2021-09-19 07:51:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 0:32:38-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码