
C++
文章平均质量分 64
小键233
生活才是我的职业,而程序员,那只是我的副业
==
展开
-
c++ 关键字: explicit
explicit 这个关键字用于修饰类的构造函数,防止类进行隐式转换。关于这个关键字有两点: 只能用于修饰类的构造函数 一般用于类的单参数构造函数看一段示例代码:#include<iostream>using namespace std;class A{ int i; public: A() { i=0; } A(int原创 2016-02-04 23:13:48 · 327 阅读 · 0 评论 -
正确地复制对象--oeprator=与copy构造函数
额,这个名字有点怪怪的=_=ok,下面进入正题,为了演示方便,代码只写出简略的部分。copy构造函数class Base{public: Base() {} Base(const Base& ) { cout<<"Base copy "<<endl; }};class Derived: public Base{public: De原创 2016-05-06 16:16:51 · 570 阅读 · 0 评论 -
谈谈virtual函数
virtual , 写C++ 的都不会陌生吧,用于类的成员函数,用以表现对象多态的性质。为多态基类声明virtual 函数以前看书时,得到一条“黄金定律”(这是错误的): 永远应该以virtual 声明类的析构函数如果不这么做,那么当类成为基类时,在回收对象内存,会发生不正确的行为,导致内存泄漏。这里就不在赘述细节了。乍一看,很有道理不是么,防患于未然。但是少年呀,不能这么年轻,轻易声明vir原创 2016-05-06 14:18:38 · 2338 阅读 · 2 评论 -
以对象的形式管理资源
题目来自[1]条款13:以对象管理资源。 因为太贴切了,所以直接用了。首先说一下资源。 所有资源就是,一旦用了它,将来必须还给系统。[1]而资源一般是[1]:内存文件描述器(file decriptors)互斥锁 (mutex locks)图形界面中的字型和笔刷数据库连接网络sockets我们假设有个资源就叫做Resource 好了,它通过工厂函数(fac原创 2016-05-07 11:20:45 · 776 阅读 · 0 评论 -
swap 函数的编写
swap 函数用来交换两个变量的值,C++ 标准库提供了这个函数。前面的博客也有提到 copy and swap 技术,可以处理自我交换的情况。 那一个典型的实现就是这样的:template<typename T>void swap(T& a, T& b){ T temp(a); a = b; b = temp;}*C++ 标准库就提供了这个函数,所以并不用自己去手动原创 2016-05-07 12:24:30 · 1688 阅读 · 0 评论 -
面向对象设计时的若干考虑
在OOP 中,类之间的关系可以如下表示[1]: 当类是public 继承的时候,它们之间是is-a 关系. 当类是private 继承的时候,它们之间是is-implemented-in-terms-of 关系 当类是耦合关系时,它们之间是has-a 或者 is-implemented-in-terms-of 关系[1]中还提到两个条款: 绝不重新定义继承而来的non-virt原创 2016-05-07 12:46:30 · 338 阅读 · 0 评论 -
完全不知道怎么取标题,但是不进来看看也许会后悔--其实我一开始想写关于virtual 函数的
假如,现在有个类,它含有数据,我们需要为它编写一些遍历的函数。 就比如,类是这样的:class SomeClass{ enum{ Length = 512}; int element[Length];public: void traver() { //做一些遍历 }};那如果有需求,要求遍历函数能够依据不同的情况,采取不同的遍历函数,怎原创 2016-05-07 13:49:12 · 628 阅读 · 0 评论 -
模板
隐式接口与编译器多态假如有如下的模板函数:templatetypename T>void doSomething(T& t){ if(t.getIs() ) { t.traver(); }}那么,对于T 而言,它的隐式接口便是:bool getIs();traver();T 的类型必须要支持这两个接口才能通过编译。而原创 2016-05-08 11:12:13 · 631 阅读 · 0 评论 -
模板Trait 技术与简述template 元编程
模板Trait 技术想了好久都没有想到合适的例子,已是干脆直接使用[1]中的例子就好了。STL 中引入了迭代器的概念。但是在本文中的例子不直接使用STL 的迭代器,而是写了一段很简短的代码,作为演示使用。 本例中的迭代器有三种:Forward_Iter,只能向前进,也就是只能加非负数Bidirectional_Iter,可以双向增减Random_Iter,可以随意增减 *本例并没有沿用ST原创 2016-05-08 20:41:04 · 930 阅读 · 0 评论 -
new 与 delete 操作符
new 和 delete 是C++ 中一对动态申请内存的操作符。new_handler 行为在std的命名空间中,有这样的代码:namespace std{ typedef void (*) () new_handler; new_handler set_new_handler(new_handler p) throw();}set_new_handler的作用是,允许用户设置当原创 2016-05-09 12:38:20 · 950 阅读 · 0 评论 -
Empty Class(空类)的作用
假如有一个这样的类,没有数据成员和操作(除了本身默认存在的构造函数、复制构造函数、析构函数、copy assignment函数),那么,它能做什么?class Empty{};一开始我也是以为这样的空类能够有什么作用呢,直到我看了[1],才感叹自己如此肤浅(所以也建议你去看:)先假设我们有个很傲娇的类,它不希望通过构造函数生成,也不希望别的对象对它赋值。很不巧,如果我们没有在类中声明复制构造函数原创 2016-05-05 17:01:03 · 8817 阅读 · 0 评论 -
const 成员函数重载
先看一段引用[1]: 许多人漠视一件事实:两个成员函数如果只是常量性(constess)不同,可以被重载ok,下面为了解释,定义一下下面这个类:class Cstring{ private: char str[32]; public: Cstring(char instr[], size_t n) { for(int i=0;i<n;+原创 2016-05-05 15:56:48 · 732 阅读 · 0 评论 -
c++特性:auto
主要参考:【C++11】新特性——auto的使用auto的作用是自动类型推断,可以简化编程的工作。1、自动类型推导int main(){ // auto i; 错误,没有初始化 // auto int ii=10; 错误,旧用法,c++11不支持此用法 //1.自动帮助推导 类型 auto i =10; //int auto c = 'A';转载 2016-02-01 12:40:33 · 376 阅读 · 0 评论 -
c++特性:nullptr
主要参考: c++11新特性–nullptrnullptr(空指针): 这个特性的引入主要是为了考虑到使用 (声名狼藉的,讨厌的)NULL macro 产生的陷阱。就我们所知 NULL 是不代表任何东西,但是编译器会阐述为一个 0 在编译时期,这个阐述会导致模棱两可。因此,要小心。void SomeFunc(int i) {}void SomeFunc(char* p) {}现在像这样调用:So转载 2016-02-01 13:29:41 · 403 阅读 · 0 评论 -
c++特性:static_assert
主要参考:c++11新特性–static_assertstatic_assert: 这个宏用于检测和诊断编译时错误。编译期,这是一个与 CRT-assert(运行时宏)相反的宏。这个好东西用于检测编译时程序的不变量。 这需要一个表达式可以被计算为 bool 或 string (字符串)。如果这个表达式的值为 false ,那么编译器会出现一个包含特定字符串的错误,同时编译失败。如果为 true转载 2016-02-01 15:18:17 · 483 阅读 · 0 评论 -
c++ for_each 用法
主要参考:for_each的用法,转载自蕭鴻森的blog (找不到原文的链接)在接触C++特性Lambda时,接触到for_each,没想到这内容还挺多的,所以,先了解for_each,再学习Lambda。 这些文章其实都是在网上参考前人的博客,有些自己整理,有些不需要修改,本意是为自己学习,以备以后查阅之用。如有侵权,联系我即可。 本文代码大部分自己写过,使用MinGW。 原文非常好,建议转载 2016-02-03 11:43:27 · 69962 阅读 · 7 评论 -
c++特性:Lambda表达式
本文主要参考: C++的lambda表达式 遇见C++ Lambda - Allen Lee - 博客园Lambda表达式的基本语法,主要参考Lambda Expression Syntax: lambda-introducer(捕获字段)lambda-parameter-declaration-list(变量列表)mutable-specification(捕获的变量是否可以修改)exc原创 2016-02-03 23:19:40 · 447 阅读 · 0 评论 -
c++ 关键字:const
由于总是忘记了搞混const 的用法,所以自己写个文章,方便以后自己查阅。 *== 表示等同于const int* == int const *指向常量的指针int u=1;const int* p = &u;//p可改变,*p 不可改变int* const指针常量int u=1;int* const p = &u;//p不可改变,*p 可改变const int* const == int c原创 2016-02-04 12:35:49 · 262 阅读 · 0 评论 -
c++特性:decltype
主要参考:c++11新特性–decltype返回值 decltype(表达式) [返回值的类型是表达式参数的类型]看一些例子:template <class U, class V>void Somefunction(U u, V v){ result = u*v;//now what type would be the result??? decltype(u*v) resul转载 2016-02-04 12:40:15 · 309 阅读 · 0 评论 -
c++ 特性: 右值引用与移动语义
c++11中引入了右值引用。左值与右值先区分左值与右值,这里参考c++ 右值引用中对左值和右值区分方法: 左值和右值都是针对表达式,左值是指表达式结束后依然存在的持久对象,右值是指表达式结束时就不再存在的临时对象。 一个区分左值和右值的简便方法是:看能不能对表达式进行取地址。如果能,则为左值;如果不能,则为右值。int a, b;int* pFlag = &a;vector<int> vcT原创 2016-02-04 14:19:37 · 371 阅读 · 0 评论 -
c++ 关键字: volatile
volatile 和 const 是一对关键字。 volatile 表示不让编译器进行优化,每次读取变量的值时,都要重新从内存中读一次。 比如有代码://有全局变量int ii = 0;i = 1;i = 2;i = 3;编译器会认为:i = 3;从而只优化为1条指令。 但假如我正在进行多线程的编程,这样写存在某些合理的理由(这完全鬼扯,但是也只是假设),不希望编译器做这样的优化,那么原创 2016-02-04 23:19:48 · 377 阅读 · 0 评论 -
N 个骰子的点数
直接参考原著: 程序员面试题精选100题(43)-n个骰子的点数[算法] 循环的解法比较巧妙,mark一下。转载 2016-03-16 14:54:59 · 340 阅读 · 0 评论 -
[转]值得推荐的C/C++框架和库
找资料的时候看到一篇好博客,这里记录一下先:值得推荐的C/C++框架和库转载 2016-03-09 09:06:50 · 494 阅读 · 0 评论 -
连续空间的多维数组实现(二)
在我的这篇文章中,我提出了一种实现连续空间的二维数组的方法。https://blog.youkuaiyun.com/u014613043/article/details/51543534今天重新组织了一下新的实现方式,觉得有点意思,记录一下设计思想一个连续的多维空间数组,希望可以使用模板自动帮我们识别,这是个N 维的数组。然后二维的数组就是这个实现的泛化。于是,给出如下的类声明:template...原创 2019-07-02 23:19:47 · 398 阅读 · 0 评论