C++primer 练习13.39】的更多相关文章

13.39 编写你自己版本的StrVec,包括自己版本的reserve,capacity(参见9.4节,第318页)和resize(参见9.3.5节,第314页) 13.40 为你的StrVec类添加一个构造函数,它接受一个initializer_list<string>参数 这是StrVec.h #pragma once #include<string> #include<memory> #include<initializer_list> using n…
13.44:编写标准库string类的简化版本,命名为String.你的类应该至少有一个默认构造函数和一个接受C 风格字符串指针参数的构造函数.使用allocator为你的String类分配所需内存 String.h头文件 #pragma once #include<memory> #include<iostream> using namespace std; class String { friend ostream& operator<<(ostream&a…
拷贝控制和资源管理 • 类的行为像一个值.意味着它应该有自己的状态,当我们拷贝一个像值得对象时,副本和原对象是完全独立的,改变副本不会对原对象有任何影响. • 行为像指针的类则共享状态.当我们拷贝一个这种类的对象时,副本和原对象使用相同的底层数据,改变副本也会改变原对象. 13.2节练习 #include<iostream> #include<string> using namespace std; class HasPtr { public: HasPtr() {} HasPtr…
拷贝控制.赋值和销毁 如果一个构造函数的第一个参数是自身类的引用,且额外的参数都有默认值,则此构造函数是拷贝控制函数(拷贝构造函数不应该是explicit的). 如果我们没有为一个类定义拷贝构造函数,编译器会为我们定义一个,与合成默认构造函数不同, 即使我们定义了其他构造函数,编译器也会为我们合成一个拷贝构造函数. class Sales_data { public: Sales_data(const Sales_data&); private: string bookNo; ; double…
交换操作 class HasPtr { friend void swap(HasPtr &rhs, HasPtr &yhs); //其他成员定义 }; void swap(HasPtr &rhs, HasPtr &yhs) { using std::swap; swap(rhs.ps, yhs.ps); //交换指针,而不是string swap(rhs.i, yhs.i); //交换int成员 } • 在赋值运算符中使用swap // 注意rhs是按值传递的.意味着Has…
拷贝, 赋值与销毁 当定义一个类时, 我们显示地或隐式地指定在此类型的对象拷贝, 移动, 赋值和销毁时做什么. 一个类通过定义5种特殊的成员函数来控制这些操作, 包括: 拷贝构造函数, 拷贝赋值运算符, 移动构造函数, 移动赋值运算符和析构函数. 编译器可以合成这些成员函数, 其他的函数不能合成. 拷贝和移动构造函数定义了当用同类型的一另一个对象初始化本对象时做什么, 拷贝和移动赋值运算符定义了将一个对象赋予同类型的另一个对象时做什么. 这些操作称为拷贝控制操作. 如果我们不显式地定义这些操作,…
拷贝 赋值 销毁 拷贝构造函数 如果一个构造函数第一个参数是自身的引用,而且任何额外参数都有默认值,则此构造函数是拷贝构造函数拷贝构造函数的第一个类型必须是引用:如果参数不是引用类型,那么调用不会成功——为了调用拷贝构造函数我们必须拷贝他的实参,而拷贝实参又要调用拷贝构造函数 如果没有类定义拷贝构造函数,编译器会自动定义一个,和成默认构造函数不同,即使我们定义了其他构造函数,编译器也会为我们合成一个拷贝构造函数.对某些类来说,合成构造函数用来阻止我们拷贝该类类型的对象,而一般情况,合成的拷贝构造…
#pragma once #include<string> #include<set> using namespace std; class Message { friend class Folder; friend void swap(Message &lhs, Message &rhs); public: explicit Message(const string &str=""):contents(str){} Message(co…
右值引用 左值和右值 (1)两者区别: ①左值:能对表达式取地址.或具名对象/变量.一般指表达式结束后依然存在的持久对象. ②右值:不能对表达式取地址,或匿名对象.一般指表达式结束就不再存在的临时对象. 总结:一般而言,一个左值表达式表示的是一个对象的身份,而一个右值表达式表示的是对象的值. (2)右值的分类 ①将亡值(xvalue,eXpiring value):指生命期即将结束的值,一般是跟右值引用相关的表达式,这样表达式通常是将要被移动的对象,如返回类型为T&&的函数返回值(如std…
StrVec类的设计 [题目描述]:我们将实现标准库vector类的一个简化版本,我们所做的一个简化是不使用模板,我们类只用于string,因此,它被命名为StrVec. #include<iostream> #include<string> #include<memory> using namespace std; class StrVec { public: StrVec(): elements(nullptr), first_free(nullptr), cap(…