1111
No notes
Syntax:
C++
#include <iostream> #include <string> struct A { A(std::string s) : s(s) { std::cout << "A(" << s << ")\n"; } A( A const& o ) { s = o.s; std::cout << "copy A, s = " << s << "\n"; } std::string s; }; A byValUnnamed() { return A("byval_unnamed"); } A byValNamed() { A a("named"); return a; } A& byRef() { static A a("byref"); return a; } void byParam(A& a) { A a1("byParam"); a = a1; } int main() { // visual studio 2008 // демонстрация того, что работет return value optimization A a1 = byValUnnamed(); // в дебаге и релизе - одно копирование A a2 = byValNamed(); // в дебаге - одно копирование, в релизе - ноль копирований (!!!) // наиболее приятно, но ненадежно (скорость зависит от компилятора) A a3val = byRef(); // понятно - никому не надо, RVO и так работает всегда :) A & a3ref = byRef(); // очень негибко. Если А - член объекта, а он помрет? битая ссылка будет // если надо так делать с передачей владения, то для этого придуманы смартпойнтеры // если без передачи владения - то для этого придуман boost::weak_ptr A a5("??? not initialized object"); // вот это плохо byParam(a5); // одно копирование, Надежнее всего, но неудобно, да + плохо строчкой выше system("pause"); }