- 博客(34)
- 资源 (1)
- 收藏
- 关注
转载 C++隐式接口与编译器多态
#include<iostream>#include<string>#define someNastyWidget 128class Widget{public: Widget(std::string name = "default", std::size_t size = 0) :sname(name), ssize(size) { } Wid...
2019-04-17 15:17:01
469
1
转载 Effective C++ 之条款35-非虚函数,私有虚函数
https://blog.csdn.net/nishisiyuetian/article/details/82730961public和private继承https://www.jianshu.com/p/21d781f966801) Private继承意味着is-implemented-in-terms of(根据某物实现出)。它通常会比复合的级别低。但是当derived cl...
2019-04-16 15:16:33
351
原创 Effective C++ 之条款34-区分接口继承以及实现继承
首先当我们设计一个基类的时候,对于派生类的需求可能有以下几种:1)派生类只继承基类的接口,即函数的声明。2)派生类同时继承函数的接口和实现,同时希望能够重写自己的版本(多态)3)派生类同时继承函数接口和实现,但是不可以覆写任何东西。我们接下来具体来说明上面各种选择之间的差异:class Shape{public: virtual void draw() cons...
2019-04-16 14:46:47
330
原创 Effective C++ 之条款33避免遮掩继承而来的名称
名称的遮掩可以分为变量的遮掩和函数的遮掩两类,本质上都是通过名字的查找方式导致的,当编译器查找一个名字的时候,他一旦找到一个相符的名字,他就不会再找下去了,所以核心是看它从哪个作用域先找,因为查找是分作用域的。//例1:普通变量遮掩int i = 3; //global 变量int main(){ int i = 4; //local变量 cout <...
2019-04-16 11:23:36
262
原创 C++ 编程小技巧
1)使用常量引用形式,将map作为形参传递时的问题void test(const unordered_map<int,int> &um){ if(um[1]){ //一段测试代码 }}上述代码将不能通过编译。原因:map的[]运算符会在索引项不存在的时候自动创建一个对象,而常量不能改变。解决办法:使用迭代器替换即可,如下例所示。void...
2019-04-12 11:09:17
326
转载 C++时间日期的处理ctime
头文件:#include<ctime> 首先说明一下这个头文件主要有两个变量类型,time_t 与struct tm。 time_t 是一个算术类型,_int64也就是long long,代表的就是秒数(从1900年至今)。 struct tm是一个结构体变量,一共有九个成员。 第一个 tm_sec 一般来说范围是(0~59),但为了适...
2019-04-10 10:58:33
12767
转载 Effective C++ 31 --------将文件间的编译依存关系降至最低
在说这一条款之前,先要了解一下C/C++的编译知识,假设有三个类ComplexClass, SimpleClass1和SimpleClass2,采用头文件将类的声明与类的实现分开,这样共对应于6个文件,分别是ComplexClass.h,ComplexClass.cpp,SimpleClass1.h,SimpleClass1.cpp,SimpleClass2.h,SimpleClass2....
2019-04-09 14:03:02
208
原创 避免返回handles指向对象的内部成分
核心: 我们在写程序的时候应该避免返回handles,References、指针和迭代器统统都是所谓的handles,(号码牌,用来取得某个对象),而返回一个“代表对象内部数据”的handle,随之而来的便是“降低对象封装性”的风险,同时,一如稍早所见,他也可能导致“虽然调用const成员函数但是却造成了对象状态被改变”。 这个条款的遵循有利于增加封装性,帮助const成员函数...
2019-04-08 18:43:03
344
原创 将成员变量声明为private
封装的重要性比你最初见到它时候还重要,如果你对客户隐藏成员变量,也就是封装他们,你可以确保class的约束条件总是会得到维护,因为只有成员函数可以影响它们,同时你也保留了日后变更实现的权利。Public意味着不封装。 更改后影响的代码量也是要考虑的问题: 假设我们有一个public成员变量,而我们最终取消了它,多少代码可能会被破坏呢?答案是所有使用它的客户码都会被破坏,...
2019-04-03 16:43:34
1060
原创 成对使用new和delete,传值还是传引用
以下动作有什么错?std::string * stringArray = new std::string[100];delete stringArray; 每件事都看起来井然有序,你使用了new,搭配了delete,但是实际的情况是你的程序行为不明确,也就是说,stringArray所包含的100个string对象可能其中有99个不太可能会被适当删除,因为他们的析构函数可能...
2019-04-01 15:56:22
251
原创 Effective C++ 之条款13-以对象管理资源
概念: 在C++中使用堆内存是非常频繁的操作,我们需要new去分配内存空间,用完了之后我们要delete释放它,堆内存的申请和释放都是由程序员自己手动完成的。程序员自己管理堆内存可以提高程序的效率,但是总体而言内存管理是一件十分复杂的事情,C++11中引入了智能指针的概念,方便管理堆内存。使用普通的指针,容易造成内存泄漏(忘记释放),二次释放,程序发生异常的时候内存泄漏,因此使用...
2019-03-28 17:02:13
258
原创 Effective C++ 之条款4
1)条款四 永远在使用对象之前先将其初始化,至于内置类型以外的其他任何东西,初始化的责任落在了构造函数身上,规则很简单,确保每一个构造函数都将对象的每一个成员初始化。构造函数最好使用成员初始化列表进行初始化,最好不要在构造函数内采用赋值操作,初始值列出的成员变量,其排列次序应该和它们在class中声明的次序相同。2)不希望使用类自动生成的拷贝构造函数等等,可以将这些函数声明为pr...
2019-03-19 10:02:08
321
原创 C++ 返回引用
首先看一下返回值与返回引用之间的区别,函数返回值会创建一个临时变量作为函数返回值的副本,而返回引用则不会产生副本。1)千万不要返回对局部变量的引用,因为函数结束可能会释放局部变量的空间,因此对局部对象的引用将会指向不确定的内存,同时,指针也是一样,不能指向局部临时对象,否则指针可能变成野指针。参考文章:https://blog.csdn.net/qq_33266987/ar...
2019-03-18 14:06:32
636
原创 Effective C++ 之static,const以及变量存储位置
一:constconst关键字是一种修饰符,所谓修饰符,就是指在编译器编译过程中,给编译器一些“提示”,就const而言,它告诉编译器,这个变量在编译的过程中是不能被修改的,应用如下:1)const变量 const 变量指的是,此变量的值是只读的,不应该被改变。如果我们在程序中试图修改 const 变量的值,在编译的时候,编译器将给出错误提示。 正因为 const 变量的...
2019-03-09 18:06:27
1264
原创 基于C++11并发库的线程池与消息队列多线程框架——std::condition_variable 类
condition_variable 类是用来阻塞线程或者是多线程的同步原语,直到另一个线程修改完共享变量(the condition),并通知condition_variable 。 尝试修改变量的线程必须:获得std::mutex,典型的通过std::lock_guard() 加锁后对变量进行修改 在std::condition_variable上执行 notify...
2018-07-18 15:47:04
2131
2
原创 基于C++11并发库的线程池与消息队列多线程框架——std::mutex类
mutex类是可以用来保护共享数据的同步原语,防止被其他线程修改,也就是保证了该线程对共享数据的独占式访问。简而言之,互斥是为了防止多线程同时访问共享资源而产生数据竞争,并提供多线程的同步支持。mutex 提供了独占式的,非递归的所有权语义:线程拥有互斥量的周期:从调用lock()或者是try_lock()开始,到调用unclock()为止; 当线程拥有互斥量后,所有其他的线程尝试...
2018-07-18 09:43:18
1719
原创 基于C++11并发库的线程池与消息队列多线程框架——std::thread类
1 前言 C++11标准在标准库中为多线程提供了组件,这意味着使用C++编写与平台无关的多线程程序成为可能,而C++程序的可移植性也得到了有力的保证。 在之前我们主要使用的多线程库要么是属于某个单独平台的,例如:POSIX线程库(Linux),Windows线程库(Windows),还有第三方数据库:Boost线程库。但是且不说性能上的不同,它们都有各自缺点,要么受平台限制无法系统间移植...
2018-07-17 16:47:02
15771
原创 关于XAML名称空间的一些解释
当我们新建一个WPF程序的时候,默认的WPF窗口都参考以下四个名称空间:xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expres...
2018-06-06 14:42:49
2542
原创 WPF入门教程
1:什么是XAML? XAML,英文全称Extensible Application Markup Language,即“可扩展应用程序标记语言”。这个东西就是微软开发出来抄袭(HTML+CSS+JavaScript框架的),当然了,web前端框架也有它的好处,前后端可以完美的实现分离,前端开发人员专注于界面的UI设计以及美化,后端的程序员们专注于后台逻辑代码的实现,这种UI与逻辑之间的松耦合关...
2018-03-04 12:21:25
1013
1
转载 从普通DLL中导出C++类 – dllexport和dllimport的使用方法
来源:http://blog.csdn.net/hxb20082008/article/details/4510484MSDN是微软为使用VS的用户提供的帮助文档,里面包含了很多东西,从C/C++语言、WindowsAPI、MFC类库到各种使用心得。这几天写几个小程序练手,在准备将一个类导出时,发现还真不知道如果不用MFC的扩展DLL,是怎么导出的。但我知道dllexport可以导出函数和变量,而且
2017-07-10 11:09:57
1550
转载 临界区锁 InitializeCriticalSection()
首先,文章主体经过以下两篇文章整理而成: http://blog.csdn.net/lys07962000/article/details/41707213 http://blog.csdn.net/bytxl/article/details/46536015一:深入理解CRITICAL_SECTION概念介绍临界区是一种防止多个线程同时执行一个特定代码节的机制,这一主题并没有引起太多关注,因而
2017-07-08 15:24:40
3712
转载 C++标准模板
C++标准模板库STL一:基本概念STL提供了一组表示容器、迭代器、函数对象和算法的模板。容器是一个与数组类似的单元,可以存储若干个值。STL容器是同质的,即存储值得类型是相同的;算法是完成特定的任务(包括对数组排序或者是链表中查找某个值),迭代器用来遍历容器的对象,类似于遍历数组的指针,是广义指针。STL使得能够构造各种容器(包括数组,队列以及链表等)和执行各种操作(包括搜索,排序,随机排列等)。
2017-07-07 21:09:14
1115
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人