首页 > 编程语言 >c++引用传参是否能完全避免临时对象?

c++引用传参是否能完全避免临时对象?

时间:2024-11-20 20:45:35浏览次数:3  
标签:传参 const int c++ 对象 bool 完全避免 cmp 指针

我们都知道引用和指针传递是为了避免传参产生临时对象 

今天我在温习模板特化的时候发现 引用传参也可能会产生临时对象

所以我较了下面函数传参6种情况

A&   const A&    A*   const A*   A*&   const A*&  这些情况是否会有临时对象

1.const  type*&

#include <iostream>
using namespace std;
class A {
	public:
		A() {}
		A(int v): value(v) {}
		~A() {}
		bool operator<(const A &other) const       //必须加const  
        {
			return this->value < other.value;
		}
		int value;
};

//当我们需要传递A*时我们也希望能比较大小
bool cmp_(const A *&a, const A *&b) 
{
	return (*a) < (*b); // 比较指针指向的对象
}

int main() 
{
	A a = A(10); // 创建对象a
	A  b = A(20); // 创建对象b

	// 调用 cmp_ 函数并输出比较结果
	bool result = cmp_(&a, &b);
	cout << "Comparison result: " << result << endl;

	return 0;
}

我编译一下发现报错了

这里的报错原因是左值引用无法绑定右值 

我们知道引用是需要绑定对象的,我们希望它能绑定&a和&b

当引用的对象和实参不同时则会发生类型转换
而这里引用绑定希望绑定一个const A*的的指针 而&a和&b是 A*指针

所以在这里生成了一个const A*的临时对象 然后在给形参引用绑定

而临时对象具有常量性,是不可修改的,形参应该改为 const A* const& 声明为指针常量

 也就是如下所示

bool cmp_(const A *const &a, const A *const &b) {
	return (*a) < (*b); // 比较指针指向的对象
}

 

2.type*&

我发现只有A*&  constA*&会产生临时对象 而且两种产生的原因不同 后者是因为const的问题,而A*&是因为我们传递的&a,&b本身就是右值
当我么尝试用指针先接收&a,&b时再传递时则不会发生问题

#include <iostream>
using namespace std;

class A {
	public:
		A() {}
		A(int v): value(v) {}
		~A() {}
		bool operator<(const A &other) const {
			return this->value < other.value;
		}
		int value;
};

// 修改 cmp_ 函数,返回的比较结果需要被使用
bool cmp_(  A *&a, A *&b) {
	return (*a) < (*b); // 比较指针指向的对象
}

int main() {
	A a = A(10); // 创建对象a
	A  b = A(20); // 创建对象b
	A *p1 = &a;
	A *p2 = &b;
	// 调用 cmp_ 函数并输出比较结果
	bool result = cmp_(p1, p2);
	cout << "Comparison result: " << result << endl;

	return 0;
}

3.继承关系下的type*&

如果我们通过传递子类指针给父类指针引用时,是否又可行?

#include <iostream>
using namespace std;

class A {
	public:
		A() {}
		A(int v): value(v) {}
		~A() {}
		bool operator<(const A &other) const {
			return this->value < other.value;
		}
		int value;
};

class B: public A {
	public:
		B() {}
		B(int v): A(v) {};
		~B() {};
};

// 修改 cmp_ 函数,返回的比较结果需要被使用
bool cmp_(  A *&a, A *&b) {
	return (*a) < (*b); // 比较指针指向的对象
}

int main() {
	B a = B(10); // 创建对象a
	B  b = B(20); // 创建对象b
	B *p1 = &a;
	B *p2 = &b;
	// 调用 cmp_ 函数并输出比较结果
	bool result = cmp_(a, b);
	cout << "Comparison result: " << result << endl;

	return 0;
}

可以发现报错了,这里我们并没有传递右值,但还是产生了临时对象,是因为我们想引用绑定的是父类指针而你传递的是子类指针,所以会发生类型转换产生临时对象后绑定
解决方法:cmp_(A* const& a,A* const& b) 

继承关系is-a只存在于对象,而指针并没有继承关系所以引用绑定会产生临时对象

所以A&不会产生临时对象,因为子类本生可以看作父类

4. 总结

  • 引用绑定类型不匹配或者传入的是一个右值 则会产生临时对象再传给实参
  • 当我们需要修改传入的地址时才使用type*&否则使用type*或者type&即可 

标签:传参,const,int,c++,对象,bool,完全避免,cmp,指针
From: https://blog.csdn.net/weixin_72492465/article/details/143923149

相关文章

  • 【c++丨STL】stack和queue的使用及模拟实现
    ......
  • C++ 基类构造函数内调用虚函数会怎样
    classCatBase{public:CatBase(){show1();}~CatBase(){}//virtualvoidshow1()=0;//如果不实现,运行时会错误virtualvoidshow1(){cout<<"catbase..."<<'\n';}};......
  • 检验 C++ 入门能力:试试亲手实现日期类吧!
    ......
  • C++中的初始化列表
    初始化参数列表用于在构造函数中初始化类的数据成员。语法:构造函数():属性1(值1),属性2(值2)......{}性质:1.只能在构造函数中使用2.引用或常量必须在初始化参数列表中初始化3.初始化的顺序和成员变量的顺序一致,与初始化参数列表中的顺序无关#include<iostream>#include<vect......
  • 31. C和C++混合开发
    一、C和C++混合开发    C++可以看作是C语言的增强版,在C的基础上扩展了更多的功能。一个C程序可以看作一个简单的C++程序。但是C++和C语言之间还是存在区别的。例如,C++支持函数名重载,而C不支持,因此编译器生成目标文件时,函数名在目标文件中的临时内部名......
  • 【Linux Ops】如何替换 libstdc++ 提升 GLIBCXX 版本
    【环境】kos5.8sp2,kernel5.10还是上一篇提到的那个软件环境,其依赖的GLIBCXX版本较高,因此在安装时给出了以下错误:xxx:/lib64/libstdc++.so.6:version`GLIBCXX_3.4.29'notfound(requiredbyxxx)执行strings/usr/lib64/libstdc++.so.6|grepGLIBCXX,查看当前环境中......
  • Pylon C++ Programmer's Guide
    移步至PylonC++Programmer'sGuide观看效果更佳GettingStartedpylon编程指南是一个关于如何使用BaslerpylonC++API进行编程的快速指南。它可以与pylon示例代码一起使用,以帮助初学者入门。此外,APIrenfence提供了有关BaslerpylonC++接口的描述。接口的描述也可在pylon的......
  • 1.C++基础知识—指针篇
    #指针#变量#1.一个整型数 intnumber;2.一个指向整型数的指针 int* ptrToInt;3.一个指向指针的指针,它指向的指针是指向一个整型数int**ptrToPtrToInt;4.一个有10个整型数的数组intarry[10];5.一个有10个指针的数组,该指针是指向一个整型数的int*ptrArray[10];6......
  • C++基础知识-const篇
    1.const作用在C++中,const 关键字用于定义常量,确保某些数据不会被修改。const的作用包括但不限于以下几点:1.定义常量值:  const 可以用来定义不会改变的常量值  constintMAX_USERS=100;2.修饰指针:  const可以修饰指针,以限制指针指向的数据是否可以被修改......
  • 【c++笔试强训】(第十六篇)
    目录游游的⽔果⼤礼包(枚举)题目解析讲解算法原理编写代码买卖股票的最好时机(⼆)(贪⼼)题目解析讲解算法原理编写代码游游的⽔果⼤礼包(枚举)题目解析1.题目链接:登录—专业IT笔试面试备考平台_牛客网2.题目描述题目描述游游有nnn个苹果,mmm个桃子。她可以把2个苹......