const、&、方法返回类型区分(c++)

目录

1.传参const std::string& n和const std::string n区别

2.传参std::string n 和std::string& n区别 

3.std::string& getName() 和std::string getName() 区别


比较啰嗦,但是新手可能需要啰嗦。 

1.传参const std::string& n和const std::string n区别

`const std::string& n` 和 `const std::string n` 的主要区别在于一个是引用,一个是值。这对函数的参数传递和对象的复制行为有重要影响:

1. `const std::string& n`:这是对常量字符串的引用。使用它作为函数参数可以有效地传递大对象,因为它只传递了对象的引用,而不是创建了对象的副本。同时,因为它是常量引用,所以你不能在函数内部修改这个字符串。

2. `const std::string n`:这是一个常量字符串。使用它作为函数参数时,将创建传递的字符串的一个副本。在函数内部,你不能修改这个字符串(因为它是常量)。相对于常量引用,这种方式可能会增加额外的拷贝成本,特别是当字符串非常大的时候。

在大多数情况下,如果你不需要修改传递的字符串,并且希望避免可能的拷贝成本,你应该使用 `const std::string& n`。

2.传参std::string n 和std::string& n区别 

1. `std::string n`:这是一个字符串对象。作为函数参数时,它会创建传递的字符串的一个副本。在函数内部,你可以修改这个副本,而不会影响到原始的字符串。

2. `std::string& n`:这是一个对字符串的引用。作为函数参数时,它也不会创建字符串的副本,但它允许函数修改传递的字符串。所以,如果你在函数内部修改了 `n`,那么这个修改也会反映到原始的字符串上。

在选择哪种类型作为函数参数时,要考虑你的需求。如果你需要修改传递的字符串,并且希望这个修改能反映到函数外部,你应该使用 `std::string& n`。如果你不需要(或不应)修改传递的字符串,你应该使用 `const std::string& n` 或 `std::string n`。如果传递的字符串可能很大,为了避免拷贝成本,你应该使用引用类型。

3.std::string& getName() 和std::string getName() 区别

`std::string& getName()` 和 `std::string getName()` 这两个函数的主要区别在于返回值

`std::string& getName()` 返回一个对字符串的引用。这意味着返回的是原始字符串对象的引用,因此,你可以修改这个返回值,从而改变原始对象的状态。同时,这也避免了返回大对象时的性能损失。

`std::string getName()` 则返回一个字符串的副本。这意味着返回的是原始字符串的一个拷贝,所以你可以修改返回的字符串而不影响原始对象

下面这些注意点,可以先不看,踩坑印象才深刻:

但要注意,返回引用有一定的风险,如果返回的引用是指向一个局部变量的引用,那么当函数执行完毕后,这个引用就会变为悬空引用(指向已经被销毁的对象),再使用这个引用就会导致未定义的行为。所以在使用返回引用的函数时,需要特别小心。

1. 使用 `std::string& getName()`

如果你希望能通过这个函数直接修改对象的内部状态,你可以使用返回引用的版本。例如:

cpp
class Person {
    std::string name;
public:
    Person(const std::string& n) : name(n) {}
    std::string& getName() { return name; }
};

int main() {
    Person p("Alice");
    p.getName() = "Bob";  // 修改对象的内部状态
    std::cout << p.getName();  // 输出 "Bob"
}

在这个例子中,`getName()` 返回了 `name` 的引用,所以我们可以通过 `getName()` 来修改 `Person` 对象的 `name` 属性。

2. 使用 `std::string getName()`

如果你只需要获取对象的状态,而不需要(或不应)修改它,你可以使用返回值的版本。例如:

cpp
class Person {
    std::string name;
public:
    Person(const std::string& n) : name(n) {}
    std::string getName() { return name; }
};

int main() {
    Person p("Alice");
    std::string name = p.getName();
    name = "Bob";  // 这不会影响到 p 的 name
    std::cout << p.getName();  // 输出 "Alice"
}

在这个例子中,`getName()` 返回了 `name` 的副本,所以我们无法通过修改 `getName()` 的返回值来改变 `Person` 对象的 `name` 属性。

 常用的基本就这些,后续可能继续补充。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>