About reference in C++11

class Dog
{
public:
  Dog()
  {
    age_= 0;
  }

  int age_;
  std::string name_;
  using pointer = boost::shared_ptr<Dog>;
};

 

void ChangeDogV0(const Dog& dog)
{
  dog.age_ = 1; // compiling error
}

void ChangeDogV1(Dog dog, int age) const
{
  dog.age_ = age;
}

void ChangeDogV2(Dog& dog, int age) const
{
  dog.age_ = age;
}

void ChangeDogV3(Dog::pointer dog, int age) const

{
  std::cout << "Dog's address : " << &dog << std::endl; // different address
  dog->age_ = age;
}

void ChangeDogV4(Dog::pointer& dog, int age) const
{
  std::cout << "Dog's address : " << &dog << std::endl; // same address
  dog->age_ = age;
}

void ChangeDogV5(const Dog::pointer& dog, int age) const
{
  std::cout << "Dog's address : " << &dog << std::endl; // same address
  dog->age_ = age;
}

void ChangeDogsV1(boost::shared_ptr<std::vector<Dog::pointer>> dogs) const
{
  Dog::pointer dog = boost::make_shared<Dog>();
  dog_age_counter_ += 1;
  ChangeDogV5(dog, dog_age_counter_);

  dogs->push_back(dog);
}

void ChangeDogsV2(boost::shared_ptr<std::vector<Dog::pointer>>& dogs) const
{
  Dog::pointer dog = boost::make_shared<Dog>();
  dog_age_counter_ += 1;
  ChangeDogV5(dog, dog_age_counter_);
  dogs->push_back(dog);
}

void ChangeDogsV3(const boost::shared_ptr<std::vector<Dog::pointer>>& dogs) const
{
  Dog::pointer dog = boost::make_shared<Dog>();
  dog_age_counter_ += 1;
  ChangeDogV5(dog, dog_age_counter_);
  dogs->push_back(dog);
}

void main()
{
  Dog dog1;
  ChangeDogV1(dog1, 1);
  std::cout << "Dog1's age : " << dog1.age_ << std::endl; //0

  Dog dog2;
  ChangeDogV2(dog2, 2);
  std::cout << "Dog2's age : " << dog2.age_ << std::endl; // 2

  Dog::pointer dog3 = boost::make_shared<Dog>();
  ChangeDogV3(dog3, 3);
  std::cout << "Dog3's age : " << dog3->age_ << std::endl; // 3

  Dog::pointer dog4 = boost::make_shared<Dog>();
  ChangeDogV4(dog4, 4);
  std::cout << "Dog4's age : " << dog4->age_ << std::endl; // 4

  Dog::pointer dog5 = boost::make_shared<Dog>();
  ChangeDogV5(dog5, 5);
  std::cout << "Dog5's age : " << dog5->age_ << std::endl; // 5

  Dog::pointer dog6 = boost::make_shared<Dog>();
  boost::shared_ptr<std::vector<Dog::pointer>> dogs = boost::make_shared<std::vector<Dog::pointer>>();
  dogs->push_back(dog6);
  ChangeDogsV1(dogs);
  ChangeDogsV2(dogs);
  ChangeDogsV3(dogs);
  for (const auto& dog : *dogs)
  {
    std::cout << "Dog's age : " << dog->age_ << std::endl; // 0, 1, 2, 3
  }
}

 

posted @ 2021-04-28 10:26  ylron  阅读(55)  评论(0)    收藏  举报