您的位置:首页 > 其它

13.6.1

2017-02-10 16:50 316 查看
13.45

左值引用一般绑定在左值上

右值引用引用对象将被销毁,对象没有其他用户

13.46

int f();
vector<int> vi(100);
int&& r1 = f();
int& r2 = vi[0];
int& r3 = r1;
int&& r4 = vi[0] * f();


13.47

#include <memory>

class String
{
public:
String() : String("") { }
String(const char *);
String(const String&);
String& operator=(const String&);
~String();

const char *c_str() const { return elements; }
size_t size() const { return end - elements; }
size_t length() const { return end - elements - 1; }

private:
std::pair<char*, char*> alloc_n_copy(const char*, const char*);
void range_initializer(const char*, const char*);
void free();

private:
char *elements;
char *end;
std::allocator<char> alloc;
};


#include <algorithm>
#include <iostream>

std::pair<char*, char*>
String::alloc_n_copy(const char *b, const char *e)
{
auto str = alloc.allocate(e - b);
return{ str, std::uninitialized_copy(b, e, str) };
}

void String::range_initializer(const char *first, const char *last)
{
auto newstr = alloc_n_copy(first, last);
elements = newstr.first;
end = newstr.second;
}

String::String(const char *s)
{
char *sl = const_cast<char*>(s);
while (*sl)
++sl;
range_initializer(s, ++sl);
}

String::String(const String& rhs)
{
range_initializer(rhs.elements, rhs.end);
std::cout << "copy constructor" << std::endl;
}

void String::free()
{
if (elements) {
std::for_each(elements, end, [this](char &c){ alloc.destroy(&c); });
alloc.deallocate(elements, end - elements);
}
}

String::~String()
{
free();
}

String& String::operator = (const String &rhs)
{
auto newstr = alloc_n_copy(rhs.elements, rhs.end);
free();
elements = newstr.first;
end = newstr.second;
std::cout << "copy-assignment" << std::endl;
return *this;
}


13.48

#include <vector>
#include <iostream>

// Test reference to http://coolshell.cn/articles/10478.html 
void foo(String x)
{
std::cout << x.c_str() << std::endl;
}

void bar(const String& x)
{
std::cout << x.c_str() << std::endl;
}

String baz()
{
String ret("world");
return ret;
}

int main()
{
char text[] = "world";

String s0;
String s1("hello");
String s2(s0);
String s3 = s1;
String s4(text);
s2 = s1;

foo(s1);
bar(s1);
foo("temporary");
bar("temporary");
String s5 = baz();

std::vector<String> svec;
svec.reserve(8);
svec.push_back(s0);
svec.push_back(s1);
svec.push_back(s2);
svec.push_back(s3);
svec.push_back(s4);
svec.push_back(s5);
svec.push_back(baz());
svec.push_back("good job");

for (const auto &s : svec) {
std::cout << s.c_str() << std::endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: