c++赋值构造函数为什么返回引用类型?

2020-11-22 12:42

阅读:471

标签:style   blog   http   java   color   使用   

目录

0 前言

1 内置类型

2 自定义类型

3 结论

4 源码

0. 前言

  c++默认赋值构造函数的返回值是引用类型,c++赋值运算符=的本意是返回左值的引用,我们重载赋值构造函数的时候,返回值是否应该设为引用类型呢? 按照《Effective C++》中第10条,最好是设为引用类型。

  本文,通过实验来表述返回值是否为引用类型的区别。

1. 内置类型

  int i= 1,     j=2,    k=3;

  • case1: k = j = i

    i == 1

  j == 1

  k == 1

  • case2: (k = j) = i

    i == 1

  j == 2

  k == 1

2. 自定义类型

  People p1("p1"),     p2("p2"),     p3("p3");

  • case1: p3 = p2 = p1
    • 使用默认赋值构造函数

      p3 == p1

    p2 == p1

    • 返回引用的People

      p3 == p1

  p2 == p1

    • 不返回引用的People

      p3 == p1

    p2 == p1

  • case2: (p3 = p2) = p1
    • 使用默认赋值构造函数

       p3 == p1

    p2 == p2

    • 返回引用的People

  p3 == p1

  p2 == p2

    • 不返回引用的People

      p3 == p2

    p2 == p2

3. 结论

  • case1,是否返回引用没有影响;
  • case2,是否返回引用是有区别的,由于c++内置类型的赋值重载操作符是返回引用的,所以我们应该遵循规则,类的赋值构造函数返回引用类型

4. 实验源码

mamicode.com,搜素材
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include string>
#include 
#include 

#include 
#include using std::cout;
using std::endl;
using std::string;
using std::vector;
using std::stringstream;

void test_int()
{
  cout "test_int()"  endl;
  int i = 1, j = 2, k = 3;

  k = j = i;

  cout "\ti=" // 1
  cout "\tj=" // 1
  cout "\tk=" // 1
}

void test_int2()
{
  cout "test_int2()"  endl;
  int i = 1, j = 2, k = 3;

  (k = j) = i;

  cout "\ti=" // 1
  cout "\tj=" // 2
  cout "\tk=" // 1
}

class People
{
 public:
  People(const string &_name = "")
      : name(_name)
  {}

  People operator=(const People &_p)
  {
    name = _p.name;
    return *this;
  }

  string name;
};

void test()
{
  cout "test(): not reference"  endl;
  cout "\tp3=p2=p1"  endl;
  People p1("p1"), p2("p2"), p3("p3");

  p3 = p2 = p1;
  
  cout "\t\tp2.name=" // p1
  cout "\t\tp3.name=" // p1
}

void test2()
{
  cout "test2(): not reference"  endl;
  cout "\t(p3=p2)=p1"  endl;
  People p1("p1"), p2("p2"), p3("p3");

  (p3 = p2) = p1;
  
  cout "\t\tp2.name=" // p2
  cout "\t\tp3.name=" // p2
}

class PeopleRef
{
 public:
  PeopleRef(const string &_name = "")
      : name(_name)
  {}

  PeopleRef& operator=(const PeopleRef &_p)
  {
    name = _p.name;
    return *this;
  }

  string name;
};

void test_ref()
{
  cout  endl;
  cout "test_ref(): reference"  endl;
  cout "\tp3=p2=p1"  endl;
  PeopleRef p1("p1"), p2("p2"), p3("p3");;

  p3 = p2 = p1;

  cout "\t\tp2.name=" // p1
  cout "\t\tp3.name=" // p1
}

void test_ref2()
{
  cout "test_ref2(): reference"  endl;
  cout "\t(p3=p2)=p1"  endl;
  PeopleRef p1("p1"), p2("p2"), p3("p3");;

  (p3 = p2) = p1;

  cout "\t\tp2.name=" // p2
  cout "\t\tp3.name=" // p1
}

class PeopleDefault
{
 public:
  PeopleDefault(const string &_name = "")
      : name(_name)
  {}

  string name;
};

void test_default()
{
  cout  endl;
  cout "test_default()"  endl;
  cout "\tp3=p2=p1"  endl;
  PeopleDefault p1("p1"), p2("p2"), p3("p3");

  p3 = p2 = p1;
  
  cout "\t\tp2.name=" // p1
  cout "\t\tp3.name=" // p1
}

void test_default2()
{
  cout "test_default2()"  endl;
  cout "\t(p3=p2)=p1"  endl;
  PeopleDefault p1("p1"), p2("p2"), p3("p3");

  (p3 = p2) = p1;
  
  cout "\t\tp2.name=" // p2
  cout "\t\tp3.name=" // p1
}

int main ()
{
  test_int();
  test_int2();
  
  test();
  test2();
  
  test_ref();
  test_ref2();

  test_default();
  test_default2();
}
mamicode.com,搜素材

 

 

c++赋值构造函数为什么返回引用类型?,搜素材,soscw.com

c++赋值构造函数为什么返回引用类型?

标签:style   blog   http   java   color   使用   

原文地址:http://www.cnblogs.com/lovers/p/3700362.html


评论


亲,登录后才可以留言!