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 的风险。

posted @ 2023-05-23 16:05  AibaAsagi  阅读(214)  评论(0)    收藏  举报