C++Primr
文章平均质量分 77
阅读C++Primer的笔记
不动心、
这个作者很懒,什么都没留下…
展开
-
单例模式中的那些静态变量:静态成员和局部静态变量的区别
在网上看到Meyers提出的线程安全的单例模式,有点搞不懂其中的原理。Meyers提出的单例模式的代码:#include <iostream>class Singleton{public: ~Singleton(){ std::cout<<"destructor called!"<<std::endl; } Singleton(const Singleton&)=delete; Singleton&原创 2021-06-03 00:22:31 · 1137 阅读 · 4 评论 -
C++Primer 练习16.28 std::nullptr_t和nullptr
nullptr_t和nullptr一. nullptr与nullptr_t(一)nullptr_t是一种数据类型,而nullptr是该类型的一个实例。通常情况下,也可以通过nullptr_t类型创建另一个新的实例。(二)所有定义为nullptr_t类型的数据都是等价的,行为也是完全一致的。(三)std::nullptr_t类型,并不是指针类型,但可以隐式转换成任意一个指针类型(注意不能转换为非指针类型,强转也不行)。(四)nullptr_t类型的数据不适用于算术运算表达式。但可以用于关系运算表达式原创 2020-08-29 20:29:42 · 254 阅读 · 0 评论 -
C++Primer 练习16.28 类模板的前置声明和普通类的前置声明是不同的
问题看到参考答案中有这样的语句: template<typename T> class SharedPointer; template<typename T> auto swap(SharedPointer<T>& lhs, SharedPointer<T>& rhs) { using std::swap; swap(lhs.ptr, rhs.ptr); swap(lhs.ref_count, rhs.ref_coun原创 2020-08-28 21:40:51 · 365 阅读 · 0 评论 -
C++Primer 练习16.27 类模板什么时候会发生实例化?
对下面每条带标签的语句,解释发生了什么样的实例化(如果有的话)。如果一个模板被实例化,解释为什么;如果未实例化,解释为什么没有。template <typename T> class Stack {};void f1(Stack<char>);//a.仅是一个函数声明,不需实例化class Exercise { Stack<double> &rsd;//b.声明一个类模板引用,不需实例化 Stack<int> si;//c.实例化出一个Sta原创 2020-08-28 16:43:21 · 1510 阅读 · 0 评论 -
C++Primer 574页 实现Query类和Query_base类
1.编译没有重复定义,但是链接重复定义。头文件中定义导致。2.-o后面忘记加可执行文件名,结果出现下面错误,同时第一个cpp文件还会自动消失/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/Scrt1.o:在函数‘_start’中:(.text+0x20):对‘main’未定义的引用3.所有函数一定要先在头文件中声明,否则编译会出错。这里非成员重载运算符operator<<就没有在头文件中声明,光在Query.cpp文件原创 2020-08-25 14:29:00 · 365 阅读 · 0 评论 -
C++Primer 第551页 覆盖重载的函数
这里所说的如果派生类希望所有的重载版本对于它来说都是可见的,那么它就需要覆盖所有的版本,或者一个也不留是什么意思呢?实验现象#include <iostream>class base {public: virtual int func() {return 0;} virtual int func(int i) {return 1;}};class D1 : public base {public: int func() { return 2; }};class D2原创 2020-08-22 23:22:37 · 451 阅读 · 2 评论 -
C++Primer 544页 派生类向基类转换的可访问性
关于第三点:如果D继承B的方式是共有的或者受保护的,则D的派生类的成员和友元可以使用D向B的类型转换;反之,如果D继承B的方式是私有的,则不能使用这里只提到了D的派生类能不能使用D向B的类型转换,实际上,如果D继承B的方式是共有的和受保护的,那么D的派生类DD的成员也可以使用DD到B的类型转换,反之,则不能使用。关于这一点,可以从后面的练习题15.19看出。关于DD到B是怎么转换的,细节可能要从其他书上才能看到了。...原创 2020-08-22 13:50:44 · 109 阅读 · 0 评论 -
C++Primer 496页 输入运算符进行数据验证,标识错误
一些输入运算符需要做更多的数据验证的工作。例如,我们的输入运算符可能需要检查bookNo是否符合规范的格式。在这样的例子中,即使从技术上来看IO是成功的,输入运算符也应该设置流的条件状态以标识出失败信息。通常情况下,输入运算符只设置failbit。除此之外,设置eofbit表示文件耗尽,而设置badbit表示流被破坏。最好的方式是由IO标准库自己来标示这些错误。std::istream& operator>>(std::istream &is, Sales_data &am.原创 2020-08-18 13:46:28 · 155 阅读 · 0 评论 -
C++ Primer 451页 有引用成员的类,合成拷贝构造函数不是删除的
书上明确写道如果类有一个引用成员,则合成拷贝赋值函数被定义成删除的。而原因是虽然我们可以将一个新值赋予一个引用成员,但这样做改变的是引用指向的对象的值,而不是引用本身。赋值后,左侧运算对象仍然指向与赋值前一样的对象,而不会和右侧运算对象指向相同的对象。由于这种行为看起来并不是我们所期望的,所以这种情况下合成拷贝赋值运算符被定义为删除的。那么有引用成员的类,合成拷贝构造函数是不是删除的呢?定义一个类A,有一个引用成员x2,默认构造函数中x2是绑定在另一个int成员上的。#include &原创 2020-08-17 13:39:31 · 297 阅读 · 0 评论 -
C++Primer 440页 explicit禁的是什么?
1.explicit禁止的是隐式使用构造函数。class Foo{public: explicit Foo(int i = 0) : data(i) {}private: int data;};比如对于类Foo,如果使用Foo f = 1语句,实际上会发生隐式转换:用1初始化一个临时的Foo对象。即整个过程为:Foo temp_f(1); Foo f = temp_f;而explicit会禁止隐式的调用构造函数即Foo temp_f(1)过程。2.拷贝构造函数不能使用explicit修饰,原创 2020-08-17 11:23:31 · 116 阅读 · 0 评论 -
C++Primer 练习13.50 给自定义的string类添加一个移动构造函数和一个移动赋值运算符
在类中的声明:string(string&&) noexcept; string& operator=(string&&) noexcept;在类外的定义string::string(string &&s) noexcept : elements(s.elements), end(s.end){ s.elements = s.end = nullptr; std::cout << "move constructor" <原创 2020-08-15 17:28:53 · 1076 阅读 · 0 评论 -
C++Primer 练习13.43 lamda捕获类的数据成员
lambda表达式允许捕获局部变量,但是数据成员不是局部变量。用一种特殊的方法,可以捕获this。捕获this之后就可以使用类的数据成员了。class String{...private: char *elements; char *end; std::allocator<char> alloc;...};void String::free(){... std::for_each(elements, end, [this](char &c) { allo原创 2020-08-13 17:57:31 · 448 阅读 · 0 评论 -
C++Primer 练习13.39 对‘StrVec::alloc[abi:cxx11]’未定义的引用
编译出错:对‘StrVec::alloc[abi:cxx11]’未定义的引用alloc是静态数据成员,类内只是对静态成员进行了声明而不是定义,如果没有在类外进行定义的话就会出现未定义的引用。类的静态成员必须在类外进行定义。...原创 2020-08-12 20:29:26 · 1264 阅读 · 0 评论 -
C++Primer 练习12.32
编译出错:cannot bind non-const lvalue reference of type to an rvalue出现问题的函数是print(cout, tq.query(s))函数的声明为std::ostream &print(std::ostream& os, QueryResuilt &qr)如果不给print函数传递tq.query(s),而是auto a = tq.query(s),然后把a传递进去,就不会出现问题。猜测: print函数原创 2020-08-08 17:17:30 · 164 阅读 · 0 评论 -
C++Primer 420页weak_ptr的作用
weak_ptr这个智能指针有什么用?weak_ptr 的使用方法及意义原创 2020-08-05 17:23:17 · 177 阅读 · 0 评论 -
练习11.4
如果使用using namespace std,会出现编译错误11.4.cpp:17:55: error: no matching function for call to ‘remove_if(std::__cxx11::basic_string<char>::iterator, std::__cxx11::basic_string<char>::iterator, <unresolved overloaded function type>)’ word.era原创 2020-07-24 13:08:53 · 142 阅读 · 0 评论 -
练习9.16
将list<int>转换为vector<int>,然后用于条件语句中,如下所示: std::list<int> li{ 1, 2, 3, 4, 5 }; std::vector<int> vec2{ 1, 2, 3, 4, 5 }; std::vector<int> vec3{ 1, 2, 3, 4 }; std::cout << (std::vector<int>(l原创 2020-07-23 18:44:29 · 55 阅读 · 0 评论 -
练习8.11
#include <sstream>#include <string>#include <iostream>#include <vector>using namespace std;struct PersonInfo{ string name; vector<string> phones;};int main(){ string line, word; vector<PersonInfo> people;原创 2020-07-23 11:19:06 · 118 阅读 · 0 评论 -
练习7.21
还是和练习7.12的问题一样。这道题要求使用private隐藏类的细节,使用友元让read函数能够访问类中的非公有成员。这时候需要在类中进行友元声明。还是以istream为参数的构造函数,函数调用了read函数。这时候由于有了友元声明,不再需要其他声明来允许调用read函数。class Sales_data{ friend Sales_data add(Sales_data&, Sales_data&); friend std::istream &read(std::ist原创 2020-07-17 19:51:21 · 98 阅读 · 0 评论 -
练习7.12
在类里边定义一个构造函数,以istream为参数。Sales_data(std::istream &is) { read(is, *this); }问题是read函数的声明放在类里面会出现错误/tmp/cctEUx9d.o:在函数‘Sales_data::Sales_data(std::istream&)’中:7.12.cpp:(.text._ZN10Sales_dataC2ERSi[_ZN10Sales_dataC5ERSi]+0x48):对‘Sales_data::read(s原创 2020-07-17 01:02:38 · 135 阅读 · 0 评论 -
对XXXXX未定义的引用 collect2: error: ld returned 1 exit status
使用函数前有声明,但是声明和定义的形参或者返回值并不匹配。原创 2020-07-16 23:50:26 · 1454 阅读 · 1 评论