导航

随笔分类 -  C/C++

摘要:一个由C/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分... 阅读全文

posted @ 2014-04-20 15:26 网名还没想好 阅读(294) 评论(0) 推荐(0) 编辑

摘要:一、引用的本质是什么说到引用,一般C++的教材中都是这么定义的:1,引用就是一个对象的别名。2,引用不是值不占内存空间。3,引用必须在定义时赋值,将变量与引用绑定。那你有没有想过,上面的定义正确吗?编译器是如何解释引用的?这里先给出引用的本质定义,后面我们再进一步论证。1,引用实际是通过指针实现的。... 阅读全文

posted @ 2014-04-17 23:34 网名还没想好 阅读(355) 评论(0) 推荐(0) 编辑

摘要:为什么构造函数不能是虚函数?这里需要明白一个概念,那就是虚函数表vtbl,每一个拥有虚函数成员函数的类都有一个指向虚函数表的指针。对象通过虚函数表里存储的函数地址来调用虚函数。那虚函数表的指针是在什么时候初始化的呢?当然是构造函数。当我们通过new来创建一个对象的时候,第一步是申请需要的内存,第二部... 阅读全文

posted @ 2014-04-14 11:03 网名还没想好 阅读(242) 评论(0) 推荐(0) 编辑

摘要:在C++中,基类必须指出希望派生类重新定义哪些函数,定义为virtual的函数是基类期待派生类重新定义的,基类希望派生类继承的函数不能定义为虚函数。引用和指针的静态类型与动态类型可以不同,这是C++用以支持多态性的基石。通过基类引用或指针调用基类中定义的函数时,我们并不知道执行函数的对象的确切类型,执行函数的对象可能是基类类型的,也可能是派生类型的。如果调用非虚函数,则无论实际对象是什么类型,都执行基类类型所定义的函数,如果调用虚函数,则直到运行时才能确定调用哪个函数,运行的虚函数是引用所绑定的或者指针所指的对象所属类型定义的版本。 阅读全文

posted @ 2014-04-04 16:40 网名还没想好 阅读(297) 评论(0) 推荐(0) 编辑

摘要:针对const_cast,太多人在用同一个示例问同一个问题:void main(){const int a = 3;const int *pc = &a;int *p = const_cast(&a);*p = 5;printf("%d,%d,%d",*p,*pc,a); //结果是 5,5,3}最终输出的a,为何是3而不是5?C++对用const定义的常数变量,不是靠地址空间中的内容来取数的,而是靠保存在符号表中的索引来取数的,因此常数变量a无论什么情况下使用都是常数3。事实上,变量a地址空间中的内容确实是5,但即使你*(&a)来取数仍是3。你可以 阅读全文

posted @ 2014-04-03 18:03 网名还没想好 阅读(252) 评论(0) 推荐(0) 编辑

摘要:C++的四种强制类型转换,所以C++不是类型安全的。分别为:static_cast , dynamic_cast , const_cast , reinterpret_cast为什么使用C风格的强制转换可以把想要的任何东西转换成合乎心意的类型。那为什么还需要一个新的C++类型的强制转换呢?新类型的强制转换可以提供更好的控制强制转换过程,允许控制各种不同种类的强制转换。C++中风格是static_cast(content)。C++风格的强制转换其他的好处是,它们能更清晰的表明它们要干什么。程序员只要扫一眼这样的代码,就能立即知道一个强制转换的目的。四种转换的区别:static_cast:可以实现 阅读全文

posted @ 2014-04-03 17:47 网名还没想好 阅读(357) 评论(0) 推荐(0) 编辑

摘要:1,C++在定义函数重载的时候形参不管是不是const的他们都是等价的,除非形参是const引用。举个例子:void fun(int a){...}与void fun(const int a){...}是等价的,这样重载会报错说redefinition。void fun(int &a){...}与void fun(const int &a){...}这样就是正确的。2,不能从const成员函数返回指向类对象的普通引用,const成员函数只能返回*this作为一个const引用。const test_const &fun()const{...;return *this} 阅读全文

posted @ 2014-04-02 14:51 网名还没想好 阅读(451) 评论(0) 推荐(0) 编辑

摘要:我们先看一段代码: 建立people.cpp 文件,然后输入下列内容:class People{ public: int age; explicit People (int a)//加上了explict关键字的构造函数 { age=a; }};void foo ( void ){ People p1(10); //方式一 People p3=10; //方式二} 在 C++ 中, 如果一个类有只有一个参数的构造函数,C++ 允许一种特殊的声明类变量的方式。在上面的方式二: 写下如People p3=10这样的代码,且恰好10的类型(整型int)正好是people类单参数构造函数的参数类型,这时 阅读全文

posted @ 2014-04-01 14:22 网名还没想好 阅读(367) 评论(0) 推荐(0) 编辑

摘要:问题:现有类A定义如下:class A{public: A(int a) //构造函数 { m_a = a; cout<<"constructor"<<endl; } A(const A &d) //复制构造函数 { m_a = d.m_a; cout<<"copy constructor"<<endl; } A& operator=(const A &oA) //重载赋值操作符 { m_a = oA.m_a; cout<<"operator="< 阅读全文

posted @ 2014-04-01 13:55 网名还没想好 阅读(790) 评论(0) 推荐(0) 编辑

摘要:首先, C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式).那么显示声明的构造函数和隐式声明的有什么区别呢? 我们来看下面的例子:classCxString//没有使用explicit关键字的类声明,即默认为隐式声明{public:char*_pstr;int_size;CxString(intsize){_size=size;//string的预设大小_pstr=malloc(size+1);//分配strin 阅读全文

posted @ 2014-03-29 16:03 网名还没想好 阅读(79301) 评论(15) 推荐(35) 编辑

摘要:构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。例如:class CExample{public: int a; float b; CExample():a(0),b(8.8){} CExample(){ a=0; b=8.8; } }; 上面例子中两个构造函数的结果是一样的。上面的构造函数(使用初始化列表的构造函数)显示地初始化类的成员;而没有使用初始化列表的构造函数式对类的成员赋值,并没有进行显示地初始化。初始化和赋值... 阅读全文

posted @ 2014-03-28 13:36 网名还没想好 阅读(608) 评论(0) 推荐(0) 编辑

摘要:原文地址:http://hi.baidu.com/quanhaili/blog/item/5a40ba86b37e1b22c65cc38f.html类中的静态成员真是个让人爱恨交加的特性。我决定好好总结一下静态类成员的知识点,以便自己在以后面试中,在此类问题上不在被动。静态类成员包括静态数据成员和静态函数成员两部分。一 静态数据成员:类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成员。和其他数据成员一样,静态数据成员也遵守public/protected/private访问规则。同时,静态数据成员还具有以下特点:1.静态数据成员的定义。静态数据成员实际上是类域 阅读全文

posted @ 2014-03-26 17:07 网名还没想好 阅读(196) 评论(0) 推荐(0) 编辑

摘要:写正题之前,先给出几个关键字的中英文对照,重载(overload),覆盖(override),隐藏(hide)。在早期的C++书籍中,可能翻译的人不熟悉专业用语(也不能怪他们,他们不是搞计算机编程的,他们是英语专业的),常常把重载(overload)和覆盖(override)搞错! 我们先来看一些代码及其编译结果。 实例一: #include "stdafx.h" #include class CB { public: void f(int) { cout class CB{public: virtual void f(int) { cout c... 阅读全文

posted @ 2014-03-22 09:39 网名还没想好 阅读(228) 评论(0) 推荐(0) 编辑

摘要:为了使自己的程序有很好的移植性,c++程序员应该尽量使用size_t和size_type而不是int, unsigned1. size_t是全局定义的类型;size_type是STL类中定义的类型属性,用以保存任意string和vector类对象的长度2. string::size_type制类型一般就是unsignedint,但是不同机器环境长度可能不同win32和win64上长度差别;size_type一般也是unsignedint3. 使用的时候可以参考: string::size_typea=123; vectorsize_typeb=234; size_tb=456;4. size_ 阅读全文

posted @ 2014-03-10 13:42 网名还没想好 阅读(203) 评论(0) 推荐(0) 编辑

摘要:1,shell中的变量对大小写敏感。2,shell中的变量没有数据类型。本质上,shell脚本中的变量都是字符串,在变量的解释上则依赖于shell脚本中变量的定义。shell中的变量以字符串的形式存储在内存中要么解释为数字要么解释为字符串。例如,整形变量也是字符串,shell中允许比较操作和整数操作。其关键因素是,这个整形变量中的值是否只有数字。 阅读全文

posted @ 2012-05-19 14:51 网名还没想好 阅读(206) 评论(0) 推荐(0) 编辑

摘要:功能描述:根据文件描述词来操作文件的特性。 用法: int fcntl(int fd, int cmd); int fcntl(int fd, int cmd, long arg); int fcntl(int fd, int cmd, struct flock *lock); 参数: fd:文件描述词。 cmd:操作命令。 arg:供命令使用的参数。 lock:同上。 有以下操作命令可供使用 一. F_DUPFD :复制文件描述词 。 二. FD_CLOEXEC :设置close-on-exec标志。如果FD_CLOEXEC位是0,执行execve的过程中,文件保持打开。反之则关闭... 阅读全文

posted @ 2012-05-10 20:41 网名还没想好 阅读(321) 评论(0) 推荐(0) 编辑

摘要:1,函数模板 函数模板即允许多个函数定义简化成用统一的函数定义形式来描述。实际上,函数模板表示了一组同名函数,这些同名函数之间,都是重载函数。 函数模板定义的一般形式是: template <模板参数表> 函数类型标志符 函数名(形式参数列表) { //函数体 } 2,模板函数 函数模板是模板定义,它指明了通用的函数参数。函数模板仅能定义一次,它建立了能在不同数据类型的基础上执行相同操作的通用函数。函数模板定义仅仅是一个形式上的通用函数定义,C++编译器并不为函数模板定义产生任何程序代码。在C++程序中,可以给函数模板的类属类型指定具体的数据类型。C++编译器通过程序中对... 阅读全文

posted @ 2012-05-09 10:28 网名还没想好 阅读(477) 评论(0) 推荐(0) 编辑

摘要:一,read 函数从打开的设备或文件中读取数据#include <unistd.h> ssize_t read(int fd, void *buf, size_t count); 返回值:成功返回读取的字节数,出错返回-1并设置errno,如果在调read之前已到达文件末尾,则这次read返回0 读上来的数据保存在缓冲区buf 中,同时文件的当前读写位置向后移。注意这个读写位置和使用C标准I/O库时的读写位置有可能不同,这个读写位置是记在内核中的,而使用C标准I/O库时的读写位置是用户空间I/O缓冲区中的位置。二,write 函数向打开的设备或文件中写数据 #include < 阅读全文

posted @ 2012-05-07 15:53 网名还没想好 阅读(2183) 评论(0) 推荐(1) 编辑

摘要:core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中, 叫core dump. (linux中如果内存越界会收到SIGSEGV信号,然后就会core dump)在程序运行的过程中,有的时候我们会遇到Segment fault(段错误)这样的错误。这种看起来比较困难,因为没有任何的栈、trace信息输出。该种类型的错误往往与指针操作相关。往往可以通过这样的方式进行定位。一 造成segment fault,产生core dump的可能原因1.内存访问越界a) 由于使用错误的下标,导致数组访问越界b) 搜索字符串时,依 阅读全文

posted @ 2012-05-04 21:45 网名还没想好 阅读(888) 评论(0) 推荐(0) 编辑

摘要:本文主要参考了如下资料⑴hcj写的"Linux静态/动态链接库的创建和使用"地址 http://fanqiang.chinaunix.net/system/linux/2006-05-08/4126.shtml⑵雨亦奇的文章"LINUX动态链接库高级应用"地址http://www.ccw.com.cn/htm/center/prog/02_3_13_3_2.asp) 在此一并致谢。 一、为什么要使用库文件 我们在实际编程工作中肯定会遇到这种情况:有几个项目里有一些函数模块的功能相同,实现代码也相同,也是我们所说的重复代码。比如,很多项目里都有一个用户验证 阅读全文

posted @ 2012-05-03 22:38 网名还没想好 阅读(585) 评论(0) 推荐(0) 编辑