C++ Primer
文章平均质量分 72
xuqing-ICT
纸上得来终觉浅,绝知此事要躬行。
展开
-
C++的拖延战术:lazy evaluation
在C++中这里的拖延战术拥有一个非常优雅的名字 -- Lazy evalution。一旦你的程序中使用了lazy evaluation,那么你就可以在你实际需要某些动作时编写相应的代码,如果不需要,那么相应的动作也就永远都不会执行。那么我们在什么时候会用的上这样的技术呢?Reference Counting 引用计数对于引用技术,相信大部分人都不觉得陌生,在C++中的智能指原创 2014-12-10 09:12:20 · 4018 阅读 · 0 评论 -
C++之类的成员函数的调用 vs. 普通函数的调用
首先请看下面的语句:Point3d obj;Point3d *ptr = &obj;当使用上述指针或者对象调用成员函数Func()时,会有:obj.Func();ptr->Func();上述调用的背后到底完成了一些什么呢?假设Func函数的定义如下:Point3d Point3d::Func() const{Float a = getA();原创 2014-09-05 21:21:15 · 4767 阅读 · 3 评论 -
STL 之 iterator traits 备忘
//5种迭代器,为了激活重载机制,定义的5个类型。每种迭代器就是一个类型。struct input_iterator_tag{};struct output_iterator_tag{};struct forward_iterator_tag : public input_iterator_tag{};struct bidirectional_iterator_tag:public fo原创 2014-08-09 10:11:38 · 2109 阅读 · 0 评论 -
C++之 虚函数的访问控制 以及 编译器的绑定策略
这里文章的题目是自拟的,是因为自己最近看了一篇文章,原创 2014-08-15 17:59:19 · 1327 阅读 · 0 评论 -
C++ 继承体系中的名称覆盖
首先一个简单的例子:int x;int f(){ double x; cin >> x; return x;}在上述代码中,函数f的局部变量x掩盖了全局变量x。这得从 “C++的名字查找机制“说起,首先,在函数f的局部作用域中查找,(甚至是语句块),如果不存在,到上一层的作用域再进行查找,... 该命名空间中查找,最后是全局作用域。在类的继承体系中原创 2014-06-22 15:24:27 · 1647 阅读 · 0 评论 -
万能的函数 之 接口继承 实现继承~~~
在public继承中,(public 继承表示的关系是 “is a ” 的关系),其类中定义的函数主要有三类:pure virtual函数,impure virtual函数以及non-virtual函数,这三种函数决定了public继承中的两个重要概念 : “ 函数接口继承” 以及 “函数实现继承”。那么接下来将针对这样一个不简单的问题做一些简介。考虑如下的类定义:class Shape原创 2014-04-27 15:01:37 · 1451 阅读 · 0 评论 -
C++之 模板化基类 的名称处理
在引入模板之后,我们面临一个新的问题,那就是如果继承自一个模板基类,是否跟继承一般的类有什么区别呢?就是说,如果一个类继承自某个模板类,那么该类应该注意一些什么呢?其实,它与一般类的继承是很不一样的。先举个简单的例子:templateclass Base{ public: void printBase() {cout << "call Base原创 2014-05-03 10:59:41 · 3075 阅读 · 2 评论 -
那些你不知道的默认构造函数~~
首先,本篇文章只讲 “默认构造函数”,即如你所知,默认构造函数是不带参数的构造函数。编译器会在 适当的时候 为class合成一个默认构造函数 ~~先问以下两个问题:编译器会为任何没有声明构造函数的class,合成默认构造函数?? 错!!!合成的默认构造函数会显示设定class内的每一个data member的默认值?? 错!!!class Base{public:原创 2014-05-13 21:25:26 · 1409 阅读 · 0 评论 -
绝不重新定义继承而来的函数的缺省参数值
首先,此处的函数指的是 virtual 函数,为什么不是non-virtual函数呢?是因为在public继承中,non-virtual函数表示派生类是需要继承其接口与其强制实现的。如果你的Derived已经在考虑重写non-virtual函数了,那么你是应该好好审视一下,在此处使用 public继承是否合理了。因此,本文只讲解virtual函数的缺省参数值,例如下面的代码:{CSDN原创 2014-06-24 20:11:50 · 1700 阅读 · 0 评论 -
C++ 模板的编译 以及 类模板内部的实例化
在C++中,编译器在看到模板的定义的时候,并不立即产生代码,只有在看到用到模板时,比如调用了模板函数 或者 定义了类模板的对象的时候,编译器才产生特定类型的代码。一般而言,在调用函数的时候,只需要知道函数的声明即可;在定义类的对象时,只需要知道类的定义,不需要成员函数的定义。但是,这对于模板编译是不奏效的,模板要进行实例化,则必须能够访问定义模板的源代码,当调用函数原创 2014-05-02 12:22:52 · 5035 阅读 · 0 评论 -
从为什么要将基类的析构函数定义为虚函数谈起~~
首先,做一个最简单的实验,在电脑上运行下面的代码,将会产生运行错误,这或许会使你百思不得其解:#include using namespace std;class Base{private: int a;public: ~Base(){cout << "Base dtor..." << endl;}};class Derived : public Base{原创 2014-04-28 20:58:13 · 2739 阅读 · 0 评论 -
没有默认构造函数,如何定义对象数组
如果一个类没有定义默认构造函数,那么构造该类的对象数组将会是一个问题。于是实现了一个将new操作符掰开了来用的代码。首先分配内存,然后再在分配的内存上调用构造函数构造对象,下面的代码做一个简单的备忘。//没有定义构造函数的类不能定义该类的对象数组,内置类型除外//operator new + ctor//dtor + operator delete //operator new[]原创 2014-08-24 10:35:29 · 4614 阅读 · 0 评论 -
C++对象中数据成员的布局
首先,对于类中定义的变量,各个编译器内部并没有强制原创 2014-05-18 17:10:41 · 1545 阅读 · 0 评论 -
C++ 之 over-eager evaluation 超前评估
C++之超急评估over-eager evaluation vs. eager evaluation vs. lazy evaluation在前面已经提到了C++地懒惰求值:不要为你程序功能之外的任何事情付出任何代价。在你总是需要执行某种计算,但是该计算地结果并不总是被用到地时候,lazy evaluation 绝对可以提高你的程序的性能。但是当计算的结果总是被需要的时候,原创 2014-12-07 16:46:53 · 1756 阅读 · 0 评论 -
【提高C++性能的编程技术】读书笔记2 -- 跟踪实例
这里所说的跟踪指的是跟踪程序的运行过程。这里讨论跟踪,旨在如何利用高效的跟踪的代码,使得跟踪尽可能不增加源程序的额外开销。这里的跟踪其实很直观,就是顺着程序运行的轨迹,怎样打印出程序的每一个阶段的运行状态的log信息。因此,如何跟踪代码便是一个核心的问题。不当的跟踪方式会导致运行开销的增大。因此怎样设计出高效的跟踪技术是我们学习怎样写出高效的C++代码的一个很好的突破口。鉴于C++原创 2014-11-30 15:43:33 · 1500 阅读 · 0 评论 -
C++ 之 exception
本文讲关于C++的异常的所有东西:绝对不让异常逃离析构函数阻止exception逃离析构函数,主要是两个原因:1 防止在异常处理过程中的栈展开行为时,将调用terminate函数。程序将会结束,有时候其实错误并没有那么严重。[插入: 什么时候会调用terminate函数呢?][回答 : By default, the terminate handler call原创 2014-10-10 21:51:36 · 1803 阅读 · 0 评论 -
关于移位的有意思的小问题
首先,直接上题目:根据X得到F和G,其中X、F、G均是有符号的32位整型数,其中F = X/2; G = X>>1; 发现 F != G,下面的说法哪个是正确的:A 编译错误 B X是奇数 C X是负数 D F-G=1上述4个选项中,首先排除A和B,显然随便举个反例就有了。对于C,这里就涉及到负数在计算机中的表示形式了,至于怎么个表示法,下面一一道来:对于负数,在计原创 2014-09-25 21:20:36 · 1178 阅读 · 0 评论 -
C++函数调用之静态成员函数
首先,定义如下类A:class A{private: static int val_s;public: static int getVal(){cout << "call getVal in A..." << endl;return val_s;}};我们可以看到,上述类的定义中包含静态成员变量val_s 和静态成员函数getVal() ,对于静态的成员变量,一般原创 2014-09-06 11:27:13 · 8986 阅读 · 0 评论 -
数据结构 之 priority_queue 优先队列
C++中优先队列的实现是利用堆来实现的。在STL库中的make_heap , pop_heap以及push_heap来实现的。主要的操作有:1 push : push进一个元素,并调整堆2 pop : 弹出对首元素,并调整堆3 size : 返回队列中的元素个数4 empty : 队列是否为空5 top : 取出队首元素,但不删除该元素#include原创 2014-04-18 23:44:02 · 1656 阅读 · 0 评论 -
透彻了解 inline的里里外外 绝不是那么简单
inline 绝对需要敬而远之的关键字原创 2014-04-24 08:37:27 · 1887 阅读 · 0 评论 -
C++11之 unique_ptr
原文地址为:http://www.drdobbs.com/cpp/c11-uniqueptr/240002708在C++11中加入了很多的新特性,unique_ptr一枝独秀,对于动态分配的内存对象,它简单有效。虽然它不是万能的,但是它做的已经够好了:利用简单的语法便可以管理动态分配的对象。基本语法:unique_ptr 是一个模板类,你可以很简单地构造一个unique_ptr翻译 2014-08-24 15:58:27 · 3870 阅读 · 0 评论 -
Effective C++ 对象管理资源
看完Effective C++资源管理章节,做了一些简单的总结。原创 2014-04-03 22:49:20 · 1270 阅读 · 0 评论 -
类的构造函数 拷贝构造函数 赋值操作符 析构函数
类的那些函数~~~原创 2014-03-16 09:24:38 · 2902 阅读 · 2 评论 -
C++ 转型动作 尽量避免 以及 那些意想不到的威胁
看完EffectiveC++的关于转型的章节,顿时觉得周围的代码都处在悬崖边上~~C的旧式转型:inta = 10; double b = (double)a;对于C++的四种转型函数,const_cast去掉对象的常量性(只此一个操作符有此功能!)dynamic_cast一般用于继承体系中某对象的归属,耗费较大reinterpret_cast低原创 2014-04-22 09:34:43 · 2112 阅读 · 0 评论 -
C++类定义体中的typedef
在类中使用typedef, 最好将其放在类定义的头部。如下例:#include using namespace std;typedef int LENGTH;class Test{public: //此处的x,以及get的返回值,均被绑定到全局的typedef void set(LENGTH x){_val = x;} L原创 2014-05-19 19:44:33 · 2487 阅读 · 0 评论 -
多重继承和虚继承的内存布局
这篇文章主要讲解虚继承的C++对象内存分布问题,从中也引出了dynamic_cast和static_cast本质区别、虚函数表的格式等一些大部分C++程序员都似是而非的概念。原文见这里(By Edsko de Vries, January 2006) 敬告: 本文是介绍C++的技术文章,假定读者对于C++有比较深入的认识,同时也需要一些汇编知识。转载 2014-04-27 13:45:56 · 917 阅读 · 0 评论 -
备忘之类中的static成员的访问方式
类中的static成员在类定义完毕之后就存在在静态数据区,即使没有定义任何该类的对象。#include using namespace std;typedef int LENGTH;class Test{ typedef float LENGTH;public: void set(LENGTH x){_val = x;} LEN原创 2014-05-19 20:02:29 · 1107 阅读 · 0 评论 -
C++ 标准库之typeid
本文只讲述typeid这个操作符,呃 ,它确实是一个操作符,类似于 sizeof 操作符。在将该操作符之前,不得不提的是RTTI(Run-Time Type Identification,运行时类型识别),其实就是说在运行期得到对象的实际的类型。这立刻使我们想到了“可以通过基类的指针和引用可以指向实际的派生类型”。啊哦,答对了,这就是typeid这个强大操作符所做的事原创 2014-05-04 22:22:07 · 25449 阅读 · 9 评论 -
C strlen vs sizeof
strlen是函数。sizeof是操作符。。下面一个简单的程序说明这件事:#include #include using namespace std;int main(){ char str1[] = "To be or not to be"; cout << "sizeof [] : " << sizeof(str1) << endl; //str1占用的内存空间 cou原创 2014-04-18 10:02:06 · 1599 阅读 · 0 评论 -
private 继承 真的没用吗??
private继承,在看到effective C++之前,我发现在我之前的代码里面,没有用到这个机制,但是认真回想起还是有一些影子。大多数人认为private继承是没有用的,其实不然,在某些情况下,它也会带给你一些惊喜。好,言归正传,之前已经数次提到过 public继承表示的是 “is a ”的关系,也就是说每一个derived对象D同时也是base对象,任何在base对原创 2014-05-01 20:07:42 · 1977 阅读 · 0 评论 -
C++ new函数的背后
new函数的不为人知的背后~~~原创 2014-04-29 22:22:30 · 3706 阅读 · 0 评论 -
C++ primer 类 成员变量 成员函数 友元
看完C++Primer的第十二章,现简单总结一下:类的思想:数据抽象与封装。数据封装:指的是提供的接口与接口的实现是分离的,也就是说在使用接口时,只需要知道该接口的功能,而不必关心细节。封装:显然类将若干的数据成员封装在一起,其次,函数也是一种封装,是将一系列操作封装起来。下面开始写类中的成员。首先,本章中的类是有关键字struct或者是class来定义的。类只有在定义完成原创 2014-03-13 21:57:19 · 1460 阅读 · 0 评论 -
C++ primer 第七章笔记总结
看完C++ Primer的第七章,觉得这一章值得被一看再看,现写了一些总结,尽量囊括知识点,但绝不冗余,力求简单易懂。第七章的题目是 函数定义:int add ( int x, int y) {}前面的int为返回参数类型。add 是函数名,同时也是函数的地址。(这一句很重要)括号内 是形参表,其中的形参便是在这里定义,在函数调用时进行初始化的。{}内是函数体。函原创 2014-03-01 18:50:55 · 1184 阅读 · 0 评论 -
继承 虚继承 结构体 为内存布局抛砖引玉
虚继承以及内存布局原创 2014-04-24 20:46:35 · 2052 阅读 · 5 评论 -
备忘之 拷贝构造函数
//拷贝构造函数,什么时候算是 “合适的时候”,才会合成呢~~~#include using namespace std;class A{public: A(char *_str):str(_str),x(0){} //A(const A&a){cout //如果没有定义的话,对于类A来说,编译器依然不会合成,因为此时的对象之间的原创 2014-05-13 21:59:56 · 867 阅读 · 0 评论 -
这是绝对精彩的static成员变量
在类的定义中,成员主要分为两类:静态成员以及非静态原创 2014-05-18 18:01:19 · 1172 阅读 · 0 评论 -
vector shrink_to_fit
#include using namespace std;int main(){ vectorvec; for(int i = 0 ;i < 100 ; ++i) vec.push_back(i); cout << vec.size() << endl; //100 cout << vec.capacity() << endl; //128原创 2014-07-09 19:40:13 · 2357 阅读 · 0 评论 -
operator= 复制操作符的意外
首先,看下面的代码的输出时什么:上述代码做了最理所当然的事,就是将Derived的两个对象进行了交换。但是通过指针进行的赋值输出却不是预期的:竟然调用的是Base的operator=,也就意味着我们把d2的Base部分赋值给了d1,而现在的d1就是“一般是自己的derived,一半是d2的Base”的怪物啦!!!看来编译器没有理会我们的意图,原创 2014-07-08 20:53:29 · 933 阅读 · 0 评论 -
counting objects in class
#include using namespace std;//Version 1 : counting objects of a classclass A{private: static int count;public: A(){++count;} A(const A&){++count;} ~A(){--count;}原创 2014-07-05 09:29:47 · 1333 阅读 · 0 评论 -
swap函数 一点儿都不简单
swap函数绝不简单~原创 2014-04-19 16:11:27 · 5195 阅读 · 1 评论