- 博客(24)
- 收藏
- 关注
原创 Effective mordern c++ --- 类型推导
扎实的理解模板、auto、decltype三种类型推导十分必要。 1.理解模板参数类型推导 首先定义模板参数类型推导的定义 template void f(ParamType param) 当我们调用f(expr)时,我们可以从expr同时推导出T和ParamType两种类型,这里的ParamType跟T可以不同,比如 ParamType = const T&.这里需要分三种情况:
2017-12-12 18:15:10
536
原创 C++11多线程学习---线程函数的参数传递
线程参数传递要记住一个重要的事情,传递的参数是存在新线程一个内部的转存站中,之后在函数执行的时候再传递给函数本身的。 这种机制会引发两个问题: 1.临时参数的未及时构造 void f(int i,std::string const& s); void oops(int some_param) { char buffer[1024]; sprintf(buffer,"%i",
2017-10-15 21:43:04
4853
原创 electron安装设置代理的坑
最近尝试安装electron,安装了很久一直报错: 尝试了很多方法,最后发现是.nmprc的配置有问题,以下是我电脑可正常安装的.npmrc的配置: registry=https://registry.npm.taobao.org sass_binary_site=https://npm.taobao.org/mirrors/node-sass/ phantomjs_cdnurl=http...
2017-06-21 17:49:45
10824
原创 STL源码解析---深入理解vector
1.vector的特性 vector的数据安排以及操作方式与array非常类似,两者的唯一差别在于空间运用的灵活性。 vetor是动态空间,随着元素的加入,他的内部机制会自行扩充空间以容纳新元素。 2.vector的迭代器 因为vector维护的是一个连续的线性空间,所以不论其元素型别为何,普通指针都可以作为vector的迭代器而满足所有必要条件。 如operator*,oper
2016-12-17 14:51:52
907
原创 COM思想学习---把接口从实现中分离出来
1.在封装DLL时,首先介绍一下句柄类的思想: 当一个类里面有具体的实现内容并且有迭代更新的可能,我们通常不会把这个类选择导出。一种常用的思想是借鉴句柄的实现方式: class FastStringItf { class FastString; FastString * m_pThis; public: FastStringItf(const char * psz);
2016-12-03 14:53:28
673
原创 C++多线程学习---线程间的共享数据
多线程间的共享数据如果不加以约束是有问题的。最简单的方法就是对数据结构采用某种保护机制,通俗的表达就是: 确保只有进行修改的线程才能看到不变量被破坏时的中间状态。从其他访问线程的角度来看,修改不是已经完成了,就是还没开始。 1.使用互斥量保护共享数据 当访问共享数据前,使用互斥量将相关数据锁住,再当访问结束后,再将数据解锁。C++标准库为互斥量提供了一个RAII语法的模板类std
2016-11-21 15:02:21
9115
原创 C++多线程学习---线程管理基础
1.堤防函数已经结束,线程依然访问局部变量看以下例子: struct func { int& i; func(int& i_) : i(i_) {} void operator() () { for (unsigned j=0 ; j<1000000 ; ++j) { do_something(i);
2016-11-19 16:29:16
694
原创 C++ 多线程学习---多线程的世界
1.在程序中,并发的实现方式有两种: a.多进程并发 将每个单独的行为放置到进程中,缺点是进程之间的通信通设置复杂,速度慢,因为操作系统会在进程间提供了一定的保护措施,避免一个进程去修改另一个进程的数据。还有一个缺点是,运行多个进程所需的固定开销:需要时间启动进程,操作系统需要内部资源来管理进程,等等。 优点是:操作系统在进程间提供附加的保护操作和更高级别的通信机制,意味着可以更容易
2016-11-19 11:20:55
758
原创 More Effective C++ -----将构造函数和非成员函数虚拟化
本篇有三个重点: 1.虚拟构造函数 由于类自身的构造函数是无法定义成虚函数的,但是往往会有根据不同输入产生不同对象的需求,于是出现了以下函数: clss NLComponent; class TextBlock: public NLComponent { } class Graphic:public NLComponent { } class NewsLetter { public: pri
2016-11-10 20:26:31
540
原创 More Effective C++ --- 理解临时对象
首先理解临时对象的概念 template void Swap(T& object1,T& object2) { T temp = object1; object1 = object2; object2 = temp; }上述中的temp只是函数的一个局部对象,而真正的临时对象时看不见的! 临时对象通常在两种条件下产生。 1.为了使函数调用成功进行隐式转换 2.函数返回对象
2016-11-09 20:10:02
494
原创 Effective C++读书笔记---将文件间的编译依存关系降至最低
如果你对C++程序的某个类做了轻微的修改,修改的不是接口而是实现,当编译时,很多关联的文件都需要重新编译。 以以下程序为例: class Person { public: ... private: std::string theName; //实现细目 Date theBirthDate; //实现细目 Address theAddress; //实现
2016-10-23 14:24:15
612
原创 Effective C++读书笔记---透彻了解Inline函数
inline 函数可以免除函数调用成本,使程序更加高效。但过度的inline又会导致代码膨胀,内存增加。 仔细介绍一下inline函数 1.inline只是编译器的一个申请,不是强制的命令。 大部分编译器会拒绝太复杂的函数inline,而对所有virtual函数的也无法inline. 因为virtual函数要等到运行期才决定调用哪个函数。 总结就是一个函数是否是inline的最终决定权不
2016-10-23 13:59:46
467
原创 Effective C++读书笔记---将成员变量声明为Private;宁以非成员、非友元函数替换成员函数
将成员变量声明为Private 原因如下: 1,语法一致性,暴露出来的都是函数 2.可以对每一个变量实现权限控制,“不准访问”“只读访问”“读写访问” 3.具备更好的封装性,可以有效保障在更改某些成员变量时不会影响客户的使用 protected成员变量同样不具备较好的封装性。 宁以非成员、非友元函数替换成员函数 此条款的逻辑是这样的,当我们讨论一个类的封装性的时候。越
2016-10-23 13:37:03
469
原创 Effective C++读书笔记---尽可能延后变量定义式出现的时间
如果定义了一个带有构造函数和析构函数的变量,那么程序就要承受构造和析构的成本----你必须考虑这件事情 考虑以下函数: std::string encryptPassword(const std::string& password) { using namespace std; string encrypted; if(password.length() < MiniL
2016-08-14 10:46:47
475
原创 Effective C++读书笔记---宁以传递const引用替换值传递
你必须知道,函数参数以值传递的效率太低: class Person { public: Person(); virtual ~Person(); private: std::string name; std::string address; } class Student:public Person { public: Student(); ~
2016-08-10 21:53:52
477
原创 Effective C++读书笔记---设计与声明
良好的设计与声明习惯可以有效提高C++代码质量。 在设计接口时请记住一个原则:.让接口容易被正确使用,不易被误。 以下方法可供参考: a.增加新的类型预防用户调用接口出错 假设如下例子: class Date { public: Date(int month,int day,int year); } 用户有可能将年、月、日的顺序搞反 struct Day{}; s
2016-08-10 21:37:27
408
原创 Effective C++读书笔记---资源管理要点总结
什么是资源? 资源就是一旦使用,将来必须交还给系统,否则会发生各种异常情况。典型的资源就是动态内存分配。 其他常见资源包括互斥锁、数据库连接、画刷、网络sockets等。 有效管理资源的方式: 一 .以对象管理资源,确保两点: a.获得资源后立刻放进管理对象内。 b.管理对象运用析构函数确保资源被释放。 典型的以对象管理资源的例子为: 1.autoPtr AutoPtr 在拷贝赋
2016-08-09 22:00:19
504
原创 Effective C++读书笔记---复制对象时勿忘每一个成员
核心点有两个: 1、如果你坚持自己重写拷贝构造函数,请记住:编译器是不会提醒你是否少复制了某一个成员。 2、如果你重写派生类的拷贝构造函数和拷贝操作符时,请记住:他们不会自动调用积累的拷贝构造函数和拷贝操作符。 以下为例子,注意手动调用基类的构造函数: class PriorityCustomer:Public Customer { public: PriorityCust
2016-08-09 21:52:33
471
原创 Effective C++读书笔记---合理处理Operator =
如果你重新Operator = 时,注意以下两个事情: 1.令operator= 返回一个指向对象自身的引用 为了方便连锁赋值,如 int x,y,z; x= y =z; 为了自定义对象也实现同样的效果,必须将赋值操作符返回一个指向自身的引用: class Widget { public: Widget& operator = (const Widget& rhs)
2016-08-05 16:59:44
371
原创 Effective C++读书笔记---为多态基类声明为virtual析构函数
本篇文章有三个重点 1.为多态基类声明为virtual析构函数 原因很简单,在释放基类指针时会先调用继承类的析构函数。 只有当class内含至少一个virtual函数时,才能将其声明为virtual析构函数。无故声明virtual会增加内存开销。 对于纯虚析构函数,在声明为纯虚析构函数后还需要为其提供一份定义,因为析构函数的运作方式是最深层派生的class其析构函数最先被调用,然后是每一个
2016-08-05 16:48:01
502
原创 Effective C++读书笔记---了解C++默默编写并调用哪些构造函数
在你编写类时,C++会为你默认构造出如下函数: 1.默认的构造函数 2.析构函数 3.拷贝构造函数 4.拷贝操作符 对于拷贝构造函数和拷贝操作符编译器创建的版本只是单纯的将来源对象的每一个non-static成员变量拷贝到目标对象中。 注意:当类中含有某个变量的引用,或者有const成员函数时,此时将不能执行拷贝操作符。 同时如果在基类中将拷贝操作符定义为privat
2016-08-05 16:43:28
541
原创 Effective C++读书笔记---确定对象被使用前已先被初始化
读取未初始化的值会导致不明确的行为。------需要对使用的对象进行初始化 内置类型的初始化相对简单,对于自定义的类型则应确保在构造函数中将对象的每一个成员进行初始化。 可能你觉得下面的构造函数就是初始化了: //以下为赋值,而非初始化 ABEbtry::ABEntry(const string& name,const string& address, const std:list& p
2016-08-03 21:57:16
511
原创 Effective C++读书笔记---尽可能使用const
原则上在编译阶段可以暴露出来的问题,就不要放到执行阶段。 因此啊,如果你确定一个值时保持不变的,你就应该说出来---const 1.对于指针 char greeting[] = "xujian"; char* p = greeting; const char* p = greeting; //表示被指物是常量 char* const p = greeting;//表示指针时常量 const
2016-08-02 22:27:55
435
原创 Effective C++ 读书笔记——尽量以const,enum,inline替换 #define
#define ASPECT_RATIO 1.653 define 的问题在于:程序在编译前先进行预处理,直接将ASPECT_RATIO替换,在出现错误异常时对预处理的定位会浪费时间。 解决方法: 1.利用常量替换宏,const double AspectRatio = 1.653 在定义常量指针时,需要此形式: const char* const authorName = "xu
2016-08-02 22:16:56
495
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅