C++——类的成员函数的连续调用与返回值问题

一、返回值问题

 1 #include <iostream>
 2
 3 using namespace std;
 4
 5 class X
 6 {
 7 public:
 8     int a = 3;
 9     X set1(int b)
10     {
11         a = b;
12         return *this;
13     }
14 };
15
16 int main()
17 {
18     X x;
19     x.set1(6);
20     cout << x.a;
21
22     return 0;
23 }

此处set1函数的返回值为X,而非X&,所以x.set1(6)返回的是x的一个副本,并非x对象本身,但是return之前的语句,即此处的a = b,仍是对x对象本身进行操作的(因为是对象x调用的此函数,即此处的a仍为x.a,因为a不可能是凭空拷贝出来的),只是返回值为x对象的副本而已,所以x.a的值仍然被修改为了6.

二、连续调用问题

(1)set1与set2的返回值是引用

 1 #include <iostream>
 2
 3 using namespace std;
 4
 5 class X
 6 {
 7 public:
 8     X display()
 9     {
10         cout << a;
11         return *this;
12     }
13     X& set1(int b)
14     {
15         a = b;
16         return *this;
17     }
18
19     X& set2(int b)
20     {
21         a = b;
22         return *this;
23     }
24
25 private:
26     int a = 3;
27 };
28
29 int main()
30 {
31     X x;
32     x.set1(6).set2(7).display();
33     cout << “ ”;
34     x.display();
35
36
37     return 0;
38
39 }

如果set1与set2的返回值是引用,那么

x.set1(6).set2(7).display();     //等价于x.set1(6);  x.set2(7);  x.display();

所以此处输出为:7   7

(2)set1与set2的返回值不是引用

 1 #include <iostream>
 2
 3 using namespace std;
 4
 5 class X
 6 {
 7 public:
 8     X display()
 9     {
10         cout << a;
11         return *this;
12     }
13     X set1(int b)
14     {
15         a = b;
16         return *this;
17     }
18
19     X set2(int b)
20     {
21         a = b;
22         return *this;
23     }
24
25 private:
26     int a = 3;
27 };
28
29 int main()
30 {
31     X x;
32     x.set1(6).set2(7).display();
33     cout << “ ”;
34     x.display();
35
36
37     return 0;
38
39 }

如果set1与set2的返回值是引用,那么

x.set1(6).set2(7).display();     //不等价于x.set1(6);  x.set2(7);  x.display(); 此时后面的.set2(7).display()是对x.set1(6)返回的副本进行操作,所以此处只有x.set1(6)对原对象的值进行了操作

故此处输出为:7   6

原文地址:https://www.cnblogs.com/FengZeng666/p/9324833.html

时间: 2024-08-13 18:31:25

C++——类的成员函数的连续调用与返回值问题的相关文章

处理菱形继承问题&&实现一个虚函数的覆盖及调用&&实现以下几个类的成员函数

#include <iostream> #include <string> using namespace std; 1.实现以下几个类的成员函数 2.实现一个虚函数的覆盖及调用 3.处理菱形继承问题. 植物 class Botany { public: //(const string& name) // const char* name Botany(const char* name = "") :_name(name) //构造函数 { //cout

在类的成员函数中调用delete this

在类的成员函数中能不能调用delete this?答案是肯定的,能调用,而且很多老一点的库都有这种代码.假设这个成员函数名字叫release,而delete this就在这个release方法中被调用,那么这个对象在调用release方法后,还能进行其他操作,如调用该对象的其他方法么?答案仍然是肯定 的,调用release之后还能调用其他的方法,但是有个前提:被调用的方法不涉及这个对象的数据成员和虚函数.说到这里,相信大家都能明白为什么会这样 了. 根本原因在于delete操作符的功能和类对象的

C++ 11 线程调用类的成员函数解决办法

在C++中,_beginthreadex 创建线程是很麻烦的.要求入口函数必须是类的静态函数. 通常,可以采用thunk,或者模板来实现. 因C++ 11中引入了 std::async ,可以很好的解决这个问题了. 值得注意的是,在循环中 std::async 创建线程,我试了好多次总是失败,后来看老外的代码,采用 std::move解决了问题. 具体见实现代码. // ConsoleApplication1.cpp : 定义控制台应用程序的入口点. #include "stdafx.h&quo

类的成员函数的指针

前面一篇文章<函数的指针 >介绍了全局函数的指针,现在我们再来介绍一下成员函数的指针. 成员函数指针的定义: 一般形式 Return_Type (Class_Name::* pointer_name) (Argument_List); 用typedef简化的形式 Typedef Return_Type (Class_Name::* FuncPtr_Type) (Argument_List); FuncPtr_Type pFunc = NULL; //pFunc为成员函数指针的指针变量 成员函数

C++点滴----关于类常成员函数

关于C++中,类的常成员函数 声明样式为:   返回类型 <类标识符::>函数名称(参数表) const 一些说明: 1.const是函数声明的一部分,在函数的实现部分也需要加上const 2.const关键字可以重载函数名相同但是未加const关键字的函数 3.常成员函数不能用来更新类的成员变量,也不能调用类中未用const修饰的成员函数,只能调用常成员函数.即常成员函数不能更改类中的成员状态,这与const语义相符. 例一:说明const可以重载函数,并且实现部分也需要加const #in

(转)c++类的成员函数存储方式(是否属于类的对象)---一道面试题引发的思考

昨天去面试一家公司,面试题中有一个题,自己没弄清楚,先记录如下: class D { public: void printA() { cout<<"printA"<<endl; } virtual void printB() { cout<<"printB"<<endl; } }; main函数调用: D *d=NULL; d->printA(); d->printB(); 输出结果是? 当时想的是对象d直

C++类的成员函数使用的一些小总结

From: http://blog.csdn.net/xiayefanxing/article/details/7607506 这一阵做项目代码开发的时候,用到了在一个C++文件中使用另一个类的成员函数的问题,做个小总结. 其中有些是网上搜索的资料,因为比较分散就不一一给出出处了,请作者见谅. 1.C++如何在一个类的成员函数中调用另一个类的成员函数? 假设你想在类A里调用类B的函数int f(x),两种办法: (1)class A::B 也就是说将B定义为A的父类, 这样你就可以自然的在A里面

const修饰类的成员函数

<Effective C++>里面说,尽量使用const,const修饰变量一般有两种方式:const T *a,或者 T const *a,这两者都是一样的,主要看const位于*的左边还是右边,这里不再赘述,主要来看一下当const修饰类的成员函数时,成员函数有什么特点. 类的成员函数后面加 const,表明这个函数不会对这个类对象的数据成员(准确地说是非静态数据成员)作任何改变. 在设计类的时候,一个原则就是对于不改变数据成员的成员函数都要在后面加 const,而对于改变数据成员的成员函

C++类的成员函数的指针和mem_fun适配器的用法

一.普通函数指针 我们先来看一个最简单的函数: void fool(int a) { cout << a<< endl; } 那么它的函数指针类型为: void (*) (int) 我们可以这样测试: void (*pFunc)(int) = &foo;//这里pFunc是个指针 pFunc(123); 这样就会打印出整数123:为了简化,我们可以使用typedef: typedef void (*pFunc)(int); 这里我们要说明一下: 这里的pFunc是 返回值为