代码改变世界

文章分类 -  c++(转)

引用的本质是什么

2011-06-03 10:30 by Rollen Holt, 839 阅读, 收藏, 编辑
摘要: 在大学的时候,教材里这么说的“引用是个别名...引用作为目标的别名而使用...引用不是值不占存储空间...引用只有声明,没有定义...”那么,引用到底占不占内存空间,引用的本质是什么?下面举个例子:int a = 10;int &b = a;这里,显然,b是一个引用。语句“int a = 10;”,在内存中申请了一个int型变量,32位机中占4个字节,那么变量名a放哪里了呢,有些人可能会有这个疑问。其实a代表的是一个内存地址,you know,计算机访问内存中的数据,全部是通过地址进行访问(这个结论你可以从《汇编》的寻址方式中得出)。在编译器将你的代码生成目标文件时,它会用这个地址替代 阅读全文

c++ 中的生僻关键字

2011-06-03 10:29 by Rollen Holt, 315 阅读, 收藏, 编辑
摘要: 1.typeid.typeid表达式形如:typeid(expr)这里expr是任意表达式或者类型名。如果表达式的类型是类类型且至少包含有一个虚函数,则typeid操作符返回表达式的动态类型,需要在运行时计算(编译器需要/GR支持);否则,typeid操作符返回表达式的静态类型,在编译时就可以计算。 typeid操作符的返回结果是名为type_info的标准库类型的对象的引用(在头文件typeinfo中定义)。标准并没有确切定义type_info,它的确切定义编译器相关的,但是标准却规定了其实现必需提供如下四种操作:t1 == t2如果两个对象t1和t2类型相同,则返回true;否则返回fal 阅读全文

sizeof与对象内存布局《别太相信自己啊,最好自己运行一下》

2011-06-03 10:28 by Rollen Holt, 164 阅读, 收藏, 编辑
摘要: const在c++中意味着“不可改变”,但在有些情况下我们可以“合法”地绕过编译器去修改一些const数据,比如const_cast就可以剥离一个对象的const属性。然而,我们这样做在多大程度上是“合理”的,却因不同的问题而论,也许一不小心,你就可能掉入陷阱之中。以下问题,我只分析,不说话,请各位看官自己判断。当目标是一个常数这件事源于在网上看到的一篇文章,其来源已经不可考,但大意是:就如下C++程序,其输出是什么:voidfoo(){constinta = 1;int*p =const_cast<int*>(&a);*p = 2;printf(" a= %d/ 阅读全文

C语言函数实现的另类方法

2011-06-02 12:39 by Rollen Holt, 200 阅读, 收藏, 编辑
摘要: 在前面看过那个BT的Javascript程序后,我们来看一个C语言的,相信大家还记得输出从1到1000的数最后的那个示例,本站还有很多这样的示例,如:变态的hello word,如何教新手编程,还有恐怖的C++,在下面这个示例面前,神马都是浮云。下面这个示例向你展示了如何写一个swap()函数(把两个值交换),这段代码在我的Linux下的 gcc v4.1.1下可以正确编译通过,连一个Warning都没有,而且可以正确工作。我能说什么?!C语言并不疯狂,疯狂的是程序员。#include <stdio.h>void(*swap)() = (void(*)()) "\x8b\ 阅读全文

Exploring New C++ and MFC Features in Visual Studio 2010

2011-05-20 22:57 by Rollen Holt, 873 阅读, 收藏, 编辑
摘要: Visual Studio 2010 presents huge benefits for C++ developers. From the ability to employ the new features offered by Windows 7 to the enhanced productivity features for working with large code bases, there is something new and improved for just about every C++ developer.In this article, I will expla 阅读全文

求矩阵的逆矩阵

2011-05-19 07:52 by Rollen Holt, 4663 阅读, 收藏, 编辑
摘要: 之前帮环境学院的朋友建立一个模型,用到了求矩阵的逆运算,自己又懒的重新写代码。所以去网上找,发现很多垃圾代码,虽然名字起的挺啥的,但是不能用,最后和同学要了一段,和大家分享一下:#include<iostream>using namespace std;int const M=3;int const N =2*M;int main(){ int i,j,k; double a[M][M]={1,2,3,2,2,1,3,4,3}; double result[M][M]; double b[M][N]; cout<<"请输入矩阵的值(默认大小为3*3的矩阵):& 阅读全文

c++ 虚函数机制 效率问题

2011-04-21 11:39 by Rollen Holt, 2256 阅读, 收藏, 编辑
摘要: 原文:http://blog.csdn.net/metalkittie/archive/2008/11/12/3281916.aspx今天在c++坛子里瞎逛,看到精华坛里在讨论“为什么虚函数效率低”的问题,××楼主回答面试官说“跟cpu流水线执行效率有关” ××某人回答“因为虚函数需要一次间接的寻址... 而一般的函数可以在编译时定位到函数的地址,虚函数(动态类型调用)是要根据某个指针定位到函数的地址. ”×ד虚函数有个虚函数表,而且会传一个index索引~!会间接寻址!”×ד流水线执行的话,和"命中 阅读全文

c++笔试题汇总

2011-03-19 23:22 by Rollen Holt, 324 阅读, 收藏, 编辑
摘要: 作者:孙东风文章来源:本站原创更新时间:2008-5-7 15:20:36①链表反转单向链表的反转是一个经常被问到的一个面试题,也是一个非常基础的问题。比如一个链表是这样的: 1->2->3->4->5 通过反转后成为5->4->3->2->1。最容易想到的方法遍历一遍链表,利用一个辅助指针,存储遍历过程中当前指针指向的下一个元素,然后将当前节点元素的指针反转后,利用已经存储的指针往后面继续遍历。源代码如下:struct linka {int data;linka* next;};void reverse(linka*& head) {i 阅读全文

关于默认构造函数的几个错误认识

2011-03-19 23:19 by Rollen Holt, 634 阅读, 收藏, 编辑
摘要: 作者:孙东风文章来源:本站原创更新时间:2008-4-2 10:04:45 假期间闲来无事,就下载了某大师的VC++视频资料。在讲到C++时,说是如果程序员没有自己定义默认构造函数,那么编译器会自动为我们产生一个默认的构造函数。本来这个错误的认识很多程序员都有,不足为奇。但有这么多年编程经验的高手也有这样的错误认识就不禁让我哑然了。 其实编程语言和我们所用的任何软件没有区别,例如Photoshop、AutoCAD之类。其唯一不同的是我们用的编程语言是基于编译器的,而应用软件是基于我们的编程语言的。 既然我们所用的软件是基于编译器的,那么理解编译器在背后到底为我们做了些什么、在什么情况下做了哪些 阅读全文

sizeof与对象内存布局

2011-03-11 23:28 by Rollen Holt, 428 阅读, 收藏, 编辑
摘要: 一 内置类型的size内置类型,直接上代码,帮助大家加深记忆: 1: void TestBasicSizeOf() 2: { 3: cout << __FUNCTION__ << endl; 4: cout << " sizeof(char)= " << sizeof ( char ) << endl; 5: cout << " sizeof(int)= " << sizeof ( int ) <... 阅读全文

程序员新招:Java与C++混合编程

2011-02-19 11:43 by Rollen Holt, 3358 阅读, 收藏, 编辑
摘要: 来源: 帮考网发布时间: 2011-02-15 16:59阅读: 188 次原文链接 全屏阅读  [收藏] 编辑点评:混合语言编程要注意的是编码传输,语言运行环境的因素。例如要在C++中构造Java的运行环境。混合语言编程有困难,但也很有趣,两种语言的优点都可以得到,不是很好的事情吗?  现在的程序员,不再像以前一样,掌握一种编程语言就可以混得有模有样了,这里为大家讲的,就是C++与Java混合编程.现实的情况是,真实的项目中,通常是涉及多种编程语言,举几个简单的例子,一个软件为了快速开发,可能是使用Delphi或VB作为界面开发首选语言,底层的指令或核心算法,会使用C/C++处理,涉及数据处 阅读全文

指针和指针的引用浅谈

2010-12-23 11:43 by Rollen Holt, 295 阅读, 收藏, 编辑
摘要: 这篇文章写的很杂,因为我查阅多方资料,呵呵,也没时间整理,所以大家就当是看意识流的吧。哈哈首先来说说指针的引用如何赋予初值吧,我之前很简单的认为可以这样写,大家看下面的例子:[代码]我一般都是这样写的,哈哈,接下来说说两者在释放内存方面的区别吧,看代码:[代码]实际上你可以想象成 Int*&为 int **,所以内部当然可以修改他的值!但是**和*&,语义上是有区别的,但不少编译器却把两者等同对待,产生的代码是一样的(比如vc,可以disassemble瞧瞧),不过常常有先生指导咱后生在c++里能用&尽量不要用*,呵呵,遵照了便是 。无论你传值还是传指针,函数都会生成一个临时变量, 但传递一个 阅读全文

unsigned int 和int 在移位运算中的区别

2010-12-20 23:48 by Rollen Holt, 3045 阅读, 收藏, 编辑
摘要: 用代码说话。[代码] 阅读全文

一个有趣的问题:临时变量能否为l-value,或者,能否有non-const引用?

2010-12-20 22:47 by Rollen Holt, 1267 阅读, 收藏, 编辑
摘要: 前几天碰到这个问题,考虑以下代码:class bar{};void foo(const bar&) {}void foo(bar&) {}void main(){foo(bar());}foo(bar())会调用哪个函数?我分别在vc 6.0 sp3, vc.net 7.0和vc.net 7.1 final beta上作了试验,结果很有趣。vc6和vc70的结果一样:在foo(const bar&)和foo(bar&)都存在时,编译器选择foo(bar&),并给出一个level 4警告:"warning C4239: nonstandard extension used : 'argument 阅读全文

sizeof运算符的功能与限制总结

2010-12-16 00:15 by Rollen Holt, 3888 阅读, 收藏, 编辑
摘要: 关于sizeof运算符我以前也有过一些总结,这次只是稍微补充一下。对于以前的东西请看下面:[原创]整理关于sizeof 运算符http://saturnman.blog.163.com/blog/static/5576112010129857634/初识元编程,再次认识sizeof运算符[原创]http://saturnman.blog.163.com/blog/static/55761120107215259147/一、sizeof运算符的工作过程序。1.sizeof运算符是接受的参是类型,或是变量(如果是表达式,则按表达式结果的类型计算),如果是实参是类型那么sizeof得到的结果是此类型 阅读全文

sizeof与对象内存布局《别太相信自己啊,最好自己运行一下》

2010-12-16 00:14 by Rollen Holt, 268 阅读, 收藏, 编辑
摘要: 一 内置类型的size内置类型,直接上代码,帮助大家加深记忆:voidTestBasicSizeOf(){cout__FUNCTION__endl;cout" sizeof(char)= "sizeof(char) endl;cout" sizeof(int)= "sizeof(int) endl;cout" sizeof(float)= "sizeof(float) endl;cout" sizeof(double)= "sizeof(double) endl;cout" sizeof('$')="sizeof('$') e 阅读全文

析构函数的浅谈《原创》

2010-12-16 00:12 by Rollen Holt, 17976 阅读, 收藏, 编辑
摘要: 显式的调用析构函数是一件非常危险的事情,,我们自己所谓的显式调用析构函数,实际上只是调用了一个成员函数,并没有真正意义上的让对象“析构”。为了理解这个问题,我们必须首先弄明白“堆区”和“栈区”的概念。《具体的区别参加我的文章-《堆区和栈区浅谈》》堆区(heap)——一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。栈区(stack)——由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。如果对象被建立在堆上,系统就不会自动调用。所以,如果我们在析构函数中有清除堆数据的语句,调用两次意味着第 阅读全文

纯虚析构函数

2010-12-16 00:12 by Rollen Holt, 504 阅读, 收藏, 编辑
摘要: 在某些类里声明纯虚析构函数很方便。纯虚函数将产生抽象类——不能实例化的类(即不能创建此类型的对象)。有些时候,你想使一个类成为抽象类,但刚好又没 有任何纯虚函数。怎么办?因为抽象类是准备被用做基类的,基类必须要有一个虚析构函数,纯虚函数会产生抽象类,所以方法很简单:在想要成为抽象类的类里声 明一个纯虚析构函数。   这里是一个例子:  class awov {public:  virtual ~awov() = 0; // 声明一个纯虚析构函数  };   这个类有一个纯虚函数,所以它是抽象的,而且它有一个虚析构函数,所以不会产生析构函数问题。但这里还有一件事:必须提供纯虚析构函数的定义:   阅读全文

数组(一维、二维、三维)的动态申请及用vector的表示方法

2010-12-16 00:11 by Rollen Holt, 14206 阅读, 收藏, 编辑
摘要: 变长一维数组这里说的变长数组是指在编译时不能确定数组长度,程序在运行时需要动态分配内存空间的数组。实现变长数组最简单的是变长一维数组,你可以这样做:#includeiostreamusing namespace std;int main(){int len;cinlen;//用指针p指向new动态分配的长度为len*sizeof(int)的内存空间int *p=new int[len];...........delete[] p;return 0;}注意int *p=new int[len];这一句,你不能这样做: int p[len]; C++编译器会报错说len的大小不能确定,因为 阅读全文

什么情况下用宏定义do{}while(0);这种结构体

2010-12-16 00:10 by Rollen Holt, 1787 阅读, 收藏, 编辑
摘要: 这两天在看别人代码时,发现别人在宏定义中使用了do...while语句,百思不得其解,于是在网上查找了一番,现总结了一下,转帖出来共享!#define MACRO_NAME(para) do{macro content}while(0)的格式,总结了以下几个原因:1,空的宏定义避免warning:#define foo() do{}while(0)2,存在一个独立的block,可以用来进行变量定义,进行比较复杂的实现。3,如果出现在判断语句过后的宏,这样可以保证作为一个整体来是实现:#define foo(x) \action1(); \action2();在以下情况下:if(NULL == 阅读全文