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` 属性。
常用的基本就这些,后续可能继续补充。