C++含有const的传递和返回

2024-08-28 18:32
文章标签 c++ 传递 const 返回 含有

本文主要是介绍C++含有const的传递和返回,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!



例程参考:C++编程思想第二卷 260页

C++编译器默认由一个对象产生一个新对象时采用位拷贝方式!!

#include <fstream>
#include <string>
using namespace std;ofstream out("HowMany.out");
class HowMany
{static int objectCount;
public:HowMany(){objectCount++;}static void print(const string& msg=""){if (msg.size()!=0){out<<msg<<":";}out<<"objectCount="<<objectCount<<endl;}~HowMany(){objectCount--;print("~HowMany()");}
};
int HowMany::objectCount=0;
//值传递
HowMany f(HowMany x)//按值传递会立即产生该对象的副本
{x.print("x argument inside of f()");return x;
}int main()
{HowMany h;//调用构造函数HowMany::print("after construction of h");HowMany h2=f(h);//值传递:调用默认拷贝构造函数,函数返回调用1次析构函数;h2=f(h)赋值:调用一次拷贝构造函数;现在等于调用1次构造函数,调用2次默认拷贝构造函数,然而默认拷贝构造函数都是位复制,并未产生新对象,只是将一个对象的地址,赋给了其他两个,所以整个过程只有一个对象,却调用了三次析构函数HowMany::print("after call to f()");
}

防止按值传递

用户在类中定义一个拷贝构造函数,语法:

NoCC(const Nocc &)

函数体内可以什么都不做;如果再发生按值传递的调用,编译器会自动提示错误;


const在函数调用时的用法:参考 C++编程思想第二卷 194

一、按值传递和返回

①值传递:表示不可改变

 
 

②值返回:不可作为左值使用

若为内建类型,const应去掉,以免混淆

二、传递和返回地址

1.地址传递:临时变量可以传递给接受const引用的函数,而不可以传递给接受指针的函数,见195;

可以把非const类型传递给const类型,但是反过来不行;

2.地址返回:


总之,

可以把非const类型传给const类型,返回来却不行

传递时,两个作用:一是表示不能改变,二是可以接受临时量

返回时,表示不能作为左值



PS:C++中的临时量

①有返回值的函数返回时,产生一个临时量,语句执行完毕时,自动删除;

②函数调用时,按值传递传递的参数会立即产生一个副本

它们自动的生成为常量,改变临时量是错误的;

这篇关于C++含有const的传递和返回的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1115554

相关文章

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

C++ 中的 if-constexpr语法和作用

《C++中的if-constexpr语法和作用》if-constexpr语法是C++17引入的新语法特性,也被称为常量if表达式或静态if(staticif),:本文主要介绍C++中的if-c... 目录1 if-constexpr 语法1.1 基本语法1.2 扩展说明1.2.1 条件表达式1.2.2 fa

C++中::SHCreateDirectoryEx函数使用方法

《C++中::SHCreateDirectoryEx函数使用方法》::SHCreateDirectoryEx用于创建多级目录,类似于mkdir-p命令,本文主要介绍了C++中::SHCreateDir... 目录1. 函数原型与依赖项2. 基本使用示例示例 1:创建单层目录示例 2:创建多级目录3. 关键注

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque

C++常见容器获取头元素的方法大全

《C++常见容器获取头元素的方法大全》在C++编程中,容器是存储和管理数据集合的重要工具,不同的容器提供了不同的接口来访问和操作其中的元素,获取容器的头元素(即第一个元素)是常见的操作之一,本文将详细... 目录一、std::vector二、std::list三、std::deque四、std::forwa

C++字符串提取和分割的多种方法

《C++字符串提取和分割的多种方法》在C++编程中,字符串处理是一个常见的任务,尤其是在需要从字符串中提取特定数据时,本文将详细探讨如何使用C++标准库中的工具来提取和分割字符串,并分析不同方法的适用... 目录1. 字符串提取的基本方法1.1 使用 std::istringstream 和 >> 操作符示

C++原地删除有序数组重复项的N种方法

《C++原地删除有序数组重复项的N种方法》给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度,不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(... 目录一、问题二、问题分析三、算法实现四、问题变体:最多保留两次五、分析和代码实现5.1、问题分析5.

C++ 各种map特点对比分析

《C++各种map特点对比分析》文章比较了C++中不同类型的map(如std::map,std::unordered_map,std::multimap,std::unordered_multima... 目录特点比较C++ 示例代码 ​​​​​​代码解释特点比较1. std::map底层实现:基于红黑

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

基于Spring实现自定义错误信息返回详解

《基于Spring实现自定义错误信息返回详解》这篇文章主要为大家详细介绍了如何基于Spring实现自定义错误信息返回效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录背景目标实现产出背景Spring 提供了 @RestConChina编程trollerAdvice 用来实现 HTT