c++寻宝-2
  0eGysyk4Lrwg 2023年11月02日 51 0
c++

(目录)


一、function模版

可以实现函数的回调。c++11支持。

#include <iostream>
#include <functional> // std::function

using namespace std;

void func() {
	cout << "Line: " << __LINE__ << " " << __FUNCTION__ << endl;
}

class Test {
public:
	static int test_func(int a) {
		cout << "Line: " << __LINE__ << " " << __FUNCTION__ << "(int a)"
				<< endl;
		return a;
	}
};

class MyFunc {
public:
	int operator()(int a) {
		cout << "Line: " << __LINE__ << " " << __FUNCTION__ << "(int a)"
				<< endl;
		return a;
	}
};
int main(int argc, const char **argv) {
	function<void(void)> f1 = func;
	f1();

	function<int(int)> f2 = Test::test_func;
	cout << f2(3) << endl;

	MyFunc fo;
	function<int(int)> f3 = fo;
	cout << f3(10) << endl;

	return 0;
}

二、bind绑定函数

可以实现函数的回调。c++11支持。

#include <iostream>
#include <functional> // std::function

using namespace std;
using namespace std::placeholders;

class Test {
public:
	void func(int x, int y) {
		cout << "Line: " << __LINE__ << " " << __FUNCTION__ << endl;
		cout << "x=" << x << " y=" << y << endl;
	}

	int a;
};

int main(int argc, const char **argv) {
	Test obj;

	// 绑定成员函数
	function<void(int, int)> f1 = bind(&Test::func, &obj, _1, _2); // _1对应第一个实参, _2对应第二个实参
	f1(10, 20);

	// 绑定成员变量
	function<int& ()> f2 = bind(&Test::a, &obj);
	f2() = 30; // 等价于obj.a=30
	cout << obj.a << endl;

	return 0;
}

三、左值和右值

  • 左值:可以在等号左边,也可以在等号右边。有名字,可以取地址。 比如:变量名,返回左值引用的函数调用(一个&),++i,--i,(i=9)=100;,(i+=10)=10;,解引用*p。 主要用于避免对象拷贝。
  • 右值:只能在等号右边。没有名字,不可以取地址。 比如: 纯右值——字面值,返回非引用类型的函数调用,临时变量,i++,i--,算数表达式,逻辑表达式,比较表达式。 将亡值——c++11新引入的右值引用(移动语义)相关的类型。临时对象,return 局部本地对象,可以触发移动构造或移动赋值。 主要用于实现移动语义,实现完美转发。
T(const T &) { // 左值版本的构造
    cout << "T(const T &) 拷贝构造" << endl;
}

T& operator=(const T &) { // 左值版本的赋值
    cout << "T& operator=(const T &) 拷贝赋值" << endl;
}

T(T &&) { // 右值版本的构造
    cout << "T(T &&) 移动构造" << endl;
}

T& operator=(T &&) { // 右值版本的赋值
    cout << "T& operator=(T &&) 移动赋值" << endl;
}
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  gBkHYLY8jvYd   2023年11月19日   32   0   0 #includecic++
  ZXL8ALkrtBPG   2023年11月02日   72   0   0 c++
  ZXL8ALkrtBPG   2023年12月06日   28   0   0 字面量c++
  lh6O4DgR0ZQ8   2023年11月24日   18   0   0 cii++c++
  ZXL8ALkrtBPG   2023年11月12日   35   0   0 c++
  gBkHYLY8jvYd   2023年11月19日   27   0   0 十进制高精度c++
  ZXL8ALkrtBPG   2023年11月02日   56   0   0 c++
  ZXL8ALkrtBPG   2023年11月02日   57   0   0 c++
  gBkHYLY8jvYd   2023年12月11日   20   0   0 cic++最小值
  gBkHYLY8jvYd   2023年11月19日   30   0   0 测试点cic++
0eGysyk4Lrwg