class内部的成员函数是不需要把 自己的 privata元素传入的。因为系统已经通过this指针帮我们传入了。
#include <iostream> #include <string> #include <vector> using namespace std; /* * 本例错误的原因是:set系列函数返回的是对象 * 所以返回时产生了一个临时的对象 */ class Student { public: Student() :id_(0), name_(""), age_(0) { cout << "构造Student" << endl; } ~Student() { cout << "销毁Student" << endl; } Student setId(int id) { id_ = id; return *this; } Student setName(const string name) { name_ = name; return *this; } Student setAge(int age) { age_ = age; return *this; } void print(ostream &os) const { os << id_ << " " << name_ << " " << age_ << endl; } private: int id_; string name_; int age_; }; int main(int argc, const char *argv[]) { Student s; s.setId(11).setName("zhangsan").setAge(88).print(cout); //此处通过值拷贝返回了3个局部对象 {id_= 0, Name_ = "", age_ = 0} s.print(cout); //传入给setId() 返回一个拷贝 ①{id_= 11, Name_ = "", age_ = 0} //传入给setName() 值拷贝返回一个局部对象②{id_= 11, Name_ = "zhangsan", age_ = 0}
//传入给setAge() 值拷贝返回一个局部对象③{id_= 11, Name_ = "zhangsan", age_ = 88}
return 0; }
构造Student 11 zhangsan 88 销毁Student 销毁Student 销毁Student 11 0 销毁Student //结果打印了销魂了3个局部变量
综上,如果不通过返回引用的方式return s,成员函数其实返回的是一个拷贝的副本, 上面我们已经分析过了一共调用了3次成员函数,共返回了3个局部对象, 它们的作用域,是相继屏蔽的。
作用域的知识可以参考c与指针、
时间: 2024-11-08 21:53:46