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
}
}
浙公网安备 33010602011771号