随笔分类 -  C/C++ Beyond

 
C++内联函数
摘要:C++有三种方式实现内联函数:1. 将函数的定义写在类定义的内部;2. 在类定义内部的函数声明上用inline显式指定;3. 在类定义体外部的函数实现上用inline显式指定;#include<iostream>usingnamespacestd;classSample{public:voidinline01(){cout<<"";}inlinecharinline02()const;intinline03();};charSample::inline02()const{return'w';}inlineintinline03(){r 阅读全文
posted @ 2012-09-23 15:39 做个不善的人 阅读(3913) 评论(0) 推荐(0)
C++ 的intialization list 和assignment
摘要:[补充]如果一个类的所有成员都是public的,而且没有默认构造函数,就可以使用intialization list对类的成员进行初始化。三大法#include<iostream>#include<map>usingnamespacestd;classA{public:A(inta):i(a),j(a){//i=a;//iisnotmodifiablehere}constinti;int&j;};classB:publicA{public:B():A(0){}B(inta):A(a)//B'sbaseclassAonlyhasoneconstructor 阅读全文
posted @ 2012-09-17 19:53 做个不善的人 阅读(4649) 评论(0) 推荐(0)
理解C++的RTTI
摘要:C++的RTTI包含三部分内容:dynamic_cast, typeid和type_info(很少直接使用,但是需要了解一下,type_info的定义是由编译器定的,但是共同的是它包含一个name()函数)。 #include <iostream>#include <typeinfo>usingnamespace std;class Base1{};class Derive1 : public Base1{};class Base2{ virtualvoid fun( void ) {}};class Derive2 : public Base2{};class Der 阅读全文
posted @ 2012-09-17 08:16 做个不善的人 阅读(4547) 评论(0) 推荐(1)
C++异常处理之二 (How a VC++ compiler implements exception handling)
摘要:先占个地,看了一半,找时间全部翻译一下,很好的文章 摘译自:http://www.codeproject.com/Articles/2126/How-a-C-compiler-implements-exception-handling 一篇很好的总结文章: C与C++中的异常处理.pdf 下载地址是:http://ishare.iask.sina.com.cn/f/19763181.html 阅读全文
posted @ 2012-09-13 19:25 做个不善的人 阅读(272) 评论(0) 推荐(0)
C++异常处理之一
摘要:Exception specifications Exception specifications are used to provide summary information about what exceptions can be thrown out of a function. For example:voidMyFunction(inti)throw(...);An exception specification with an empty throw, as invoidMyFunction(inti)throw();tells the compiler that the fun 阅读全文
posted @ 2012-09-13 18:24 做个不善的人 阅读(549) 评论(0) 推荐(0)
Compare “overriding”, “overloading“ and “name hiding” in C++
摘要:C++中这几个概念非常相似,很容易混淆,在编程时也很容易导致错误 “name hiding” 是指在类的继承层次中,基类和子类共享想同名字的变量或者方法,从而导致父类的名称在子类中不可见。这种现象在c中也很普遍,比如: intiCnt=1;func(inti){intiCnt=2};//在这个函数中,所有和iCnt相关的操作都是使用函数的局部变量,这时外部的iCnt被隐藏。func(iCnt);下面给出一个类的实例: classB1{public:intnV;voidfun(){cout<<"MemberofB1"<<endl;}};classB2{ 阅读全文
posted @ 2012-09-12 10:01 做个不善的人 阅读(883) 评论(0) 推荐(0)
C++中的const关键字(zz)
摘要:【补充】mutable关键字有时我们希望类的数据成员即使在const成员函数中,依然是可以修改的,这时就可以把它们声明为mutable来实现。这样的应用,比如记录各种操作的调用次数,这时,即使在const中,依然要修改计数器,就可以将计数器变量设置为mutable的。【补充】this指针与const类ClassSample中:非const的成员函数中,this的类型是一个指向类类型的const指针,相当于:ClassSample const *this;这时,可以改变对象,但不能让this指向另外一个地址;在const的成员函数中,this的类型是一个指向const类类型的const指针,相当 阅读全文
posted @ 2012-09-11 15:43 做个不善的人 阅读(542) 评论(0) 推荐(0)
理解volatile关键字(zz)
摘要:一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:1) 并行设备的硬件寄存器(如:状态寄存器)2) 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)3) 多线程应用中被几个任务共享的变量编译器在编译代码时,会进行自动优化,用以产生优化指令。同上操作系统和一些线程同样也会对你所定义的一些变量做出一些你所不知道的更改。这样的更改我们称为,隐式修改,因为你不知道 阅读全文
posted @ 2012-09-11 10:45 做个不善的人 阅读(384) 评论(0) 推荐(0)
理解smart pointer之一(auto_ptr介绍)
摘要:a smart pointer is an abstract data type that simulates a pointer while providing additional features, such as automatic garbage collection or bounds checking. These additional features are intended to reduce bugs caused by the misuse of pointers while retaining efficiency. Smart pointers typically 阅读全文
posted @ 2012-08-27 20:11 做个不善的人 阅读(1740) 评论(0) 推荐(0)
C++ explicit
摘要:C++中, 一个参数的构造函数, 承担了两个角色。 1 是个构造器 2 是个默认且隐含的类型转换操作符。例如下面例子中C的构造函数C(int i)就是,既可以用来作为构造器,又可以实现隐式转换C c=2;但是有时这并不是我们想要的,就可以将这个构造函数声明为explicit,以避免将构造函数作为隐式类型转换符来使用。Copy constructor也是同样的,如果Copy constructor被声明为explicit,则这个类对象不能用于传参和函数返回值。但是仍然可以直接调用。//spec1_explicit.cpp//compilewith:/EHsc#include<stdio.h 阅读全文
posted @ 2012-05-12 18:03 做个不善的人 阅读(2092) 评论(0) 推荐(0)
Named Return Value Optimization
摘要:返回值在编译器中如何实现【实现模型1】cfont的实现采用了双阶段转化。1.首先声明一个额外的参数,类型上类对象的引用,用来存放返回结果。2.对这个参数利用返回值进行拷贝初始化。过程类似于参数传递,也是要定义一个临时对象,用来保存返回值,然后在函数内部调用拷贝构造函数用那个return值进行初始化。Xbar(){Xxx;//processxx...returnxx;}编译器转化后//functiontransformationtoreflect//applicationofcopyconstructor//PseudoC++Codevoidbar(X&__result){Xxx;//c 阅读全文
posted @ 2012-05-12 16:05 做个不善的人 阅读(1550) 评论(1) 推荐(1)
Copy Constructor与赋值运算符
摘要:赋值运算符‘=’的默认行为是数据成员的值的相应赋值,默认行为在类的成员中包含指针时容易出现问题,因为它只是赋值了指针的值,但是指针指向的值并未复制。赋值运算符是可以如同其他运算符一样重载的,重载后的‘=’就可以有定制的行为了。当定义Copy Constructor时一般应该重新定义赋值运算符。Copy Constructor当class object是以“相同class的另一个object“作为初值时,其内部是以所谓的default memberwise initialization手法完成的,也就是把每一个内建的或派生的data member的值,从某个object拷贝一份到另一个objec 阅读全文
posted @ 2012-05-12 14:27 做个不善的人 阅读(2095) 评论(0) 推荐(0)
Constructor
摘要:C++ Annotated Reference Manual中说“default Constructor 在需要的时候被编译器产生出来”,其关键字就是“需要的时候”,是谁需要呢?创建出来干什么事呢?class Foo {public:int val;Foo *pNext;};void foo_bar(){Foo bar;if(bar.val || bar.pnext)// do something;}在这个例子中,正确的语义是要求Foo有个default Constructor,可以将它的两个members初始化为0。但这段代码并不满足ARM中说的“在需要的时候”,其差别就在于一个是程序的需要 阅读全文
posted @ 2012-05-12 14:25 做个不善的人 阅读(1543) 评论(0) 推荐(0)
C++ Template Metaprogramming.Chapter 2
摘要:在C++中,可以在编译时进行操纵的实体称为元数据,可以分为两个类别:类型和非类型。任何种类的元数据都可以用做模版参数。 阅读全文
posted @ 2012-05-06 21:38 做个不善的人 阅读(189) 评论(0) 推荐(0)
C++ Template Metaprogramming.Chapter 1
摘要:元程序(metaprogram) Metaprogramming is the writing of computer programs that write or manipulate other programs (or themselves) as their data, or that do part of the work at compile time that would otherwise be done at runtime. 所谓元编程就是说写出的程序是用来写程序或者控制程序的,或者在编译时而不是运行时做一些工作。所以各种code generation的工具、C#或者Jav 阅读全文
posted @ 2012-05-06 21:11 做个不善的人 阅读(482) 评论(0) 推荐(0)
C++ 之 new
摘要:new的类型有三种类型的new,名字都是new,用起来也都跟分配内存有关系,分别是plain new , nothrow new和 placement new。看如下代码:class MyClass {…}; MyClass * p=new MyClass;这里的new实际上是执行如下3个过程(这三个过程都在一个new operator中完成):1. 调用malloc/heap_alloc分配内存 ;2. 调用构造函数生成类对象;3. 返回相应指针。operator new就像operator+一样,是可以重载的,但是不能在全局对原型为void operator new(size_t size 阅读全文
posted @ 2012-02-05 16:26 做个不善的人 阅读(2810) 评论(0) 推荐(0)
C++字符串之一(字符表示)
摘要:在C++中有两种类型可以用于表示字符,char和wchar_t。 但是字符串格式的标准却有很多种,如ASCII,UTF8,UTF16,UTF32等等。字符串的格式和char/wchar_t 的关系是什么呢? 首先要理解Unicode和UTF-8的关系,可以参考我转帖的文章:http://www.cnblogs.com/whyandinside/archive/2012/02/05/2338841.... 阅读全文
posted @ 2012-02-05 12:50 做个不善的人 阅读(2403) 评论(0) 推荐(1)
C和C++中的整形数据类型
摘要:数据类型是编程中碰到的一个最基本问题,下面我们来理解数据类型的实现。 首先各种数据类型是如何实现的,比如int,比如long。 首先介绍数据类型相关的一个概念,32位计算机或者64位计算机。计算系统本身是有其特点的,比如32位的系统,64位的系统等。他们之间的差别就是数据宽度的差别,对于32/64位的系统,寄存器大小是32/64位的,CPU访问内存时,一次可读取的数据也是32/64位的。但是这些并不构成数据类型的差别。 数据类型事实上是编程语言中的概念。比如汇编语言中的类型是单字节类型、双字节类型、4字节类型等;而C语言中定义int, long,short等;Java中会定义Object等高级 阅读全文
posted @ 2012-01-29 14:58 做个不善的人 阅读(2068) 评论(0) 推荐(0)
Allocator 之问
摘要:1. 为什么需要Allocator 在最开始,Allocator被设计用来为不同的内存模型提供一个抽象机制(早期的16位操作系统的指针类型有near,far等若干种类型,但是Allocator并没能解决这个问题,为什么?)Nowadays, allocators serve as an abstraction to translate the need to use memory into a raw call for memory. Thus, allocators simply separate the implementation of containers, which need to 阅读全文
posted @ 2012-01-01 17:03 做个不善的人 阅读(563) 评论(0) 推荐(0)
总结一些基本知识,帮你读懂汇编代码
摘要: 阅读全文
posted @ 2011-11-20 15:50 做个不善的人 阅读(481) 评论(0) 推荐(0)