C++对象作为函数参数
参数是对象
对象作为函数参数时,是值传递,即函数会创建一个对象的副本,形参和实参是不同的对象,它们所占地址空间不同。因此,形参的改变,并不影响实参的值。
#include <iostream>
#include <string>
#include <memory>
class Person {
public:
Person(const std::string &name) : name_(name) {}
void printName() const {
std::cout << "My name is " << name_ << std::endl;
}
~Person() {
std::cout << "destroy object" << std::endl;
}
Person(const Person &obj) {
std::cout << "run Person(const Person &obj) " << name_ << std::endl;
name_ = obj.name_;
}
Person(const Person &&obj) {
std::cout << "run Person(const Person &&obj)" << name_ << std::endl;
name_ = obj.name_;
}
private:
std::string name_;
};
void fun(Person person) {
std::cout << "address in fun : " << &person << std::endl;
}
int main(int argc, char **argv) {
Person person("Alice");
std::cout << "address in main: " << &person << std::endl;
fun(person);
}
运行结果:
address in main: 0x7ffce8e79db0
run Person(const Person &obj)
address in fun : 0x7ffce8e79dd0
destroy object
destroy object
可见 main 函数中的 person 对象和 fun 函数中的 person 对象地址不同。
在进入 fun 函数之前会调用拷贝构造函数 Person(const Person &obj,使用 main 函数中的 person 对象为参数构造 fun 函数中的 person 对象,故实参和形参地址不同。
参数是对象指针
对象指针作为函数参数时,是指针传递,即函数会创建一个指针的副本,形参和实参是不同的指针,但它们指向同一个对象。因此,形参通过解引用可以改变实参所指对象的值。但是,如果函数参数是只读的,使用指针可能会传入 nullptr 作为参数,导致运行时错误。
参数是对象引用
对象引用作为函数参数时,是引用传递,即函数不会创建任何副本,形参和实参是同一个对象的别名,它们所占的地址空间相同。因此,形参的改变会影响实参的值。如果函数参数是只读的,使用 const 引用可以避免传入 nullptr 的风险。

浙公网安备 33010602011771号