随笔分类 -  编程学习-C/C++

摘要:简单点说,就是字节的存储顺序,如果数据都是单字节的,那怎么存储无所谓了,但是对于多字节数据,比如int,double等,就要考虑存储的顺序了。注意字节序是硬件层面的东西,对于软件来说通常是透明的。再说白一点,字节序通常只和你使用的处理器架构有关,而和编程语言无关,比如常见的Intel x86系列就是小端序。Big-endian(大端序)数据的高位字节存放在地址的低端 低位字节存放在地址高端Little-endian(小端序)数据的高位字节存放在地址的高端 低位字节存放在地址低端字节的高位与低位举个例子,int a = 0x12345678 ; 那么左边12就是高位字节,右边的78就是低位字节, 阅读全文
posted @ 2013-09-16 16:14 jiayouwyhit 阅读(2510) 评论(0) 推荐(2) 编辑
摘要:本文转载于http://www.cnblogs.com/stoneJin/archive/2011/09/21/2183313.html 在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条。 (1)先来介绍它的第一条也是最重要的一条:隐藏。 当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为理解这句话,我举例来说明。我们要同时编... 阅读全文
posted @ 2013-09-16 09:39 jiayouwyhit 阅读(388) 评论(0) 推荐(0) 编辑
摘要:学习过C++基础课程的人,对重载函数的概念相对熟悉一些,但是对覆盖和隐藏就相对陌 生了,在编程技术的学习上,你会发现一个规律,很多知识点你都知道,但是一旦用起来, 就常常出错,为什么呢?笔者一直都在探索这个问题。。 重载函数有哪些特性呢? 《高质量C++/C编程指南》已经清晰的列出了重载函数的特性: (1)相同的范围(在同一个类中); (2)函数名字... 阅读全文
posted @ 2013-09-08 21:39 jiayouwyhit 阅读(232) 评论(0) 推荐(0) 编辑
摘要:本文转载至http://blog.csdn.net/hackbuteer1/article/details/7475622总结:(1)区分概念: 重载----同一个类中,相同的函数名字,不同的函数形参(与函数返回值类型的不同无关系;与函数 形参的个数、类型有关系;当形参个数、类型相同时,如一个函数的形参包含某类型的引用/指针,而另一个函数包含同类型形参的const 引用/指针,则二者可以被认为是重载); 覆盖----发生在子类与基类之间,子类与基类之间包含同名同参数的函数,且基类中该函数用virtual修饰时; 隐藏----发生在子类与基类之... 阅读全文
posted @ 2013-09-08 21:35 jiayouwyhit 阅读(339) 评论(0) 推荐(0) 编辑
摘要:构造函数不能声明为虚函数,析构函数可以声明为虚函数,而且有时是必须声明为虚函数。不建议在构造函数和析构函数里面调用虚函数。1.构造函数不能声明为虚函数的原因是:解释一:所谓虚函数就是多态情况下只执行一个。而从继承的概念来讲,总是要先构造父类对象,然后才能是子类对象。如果构造函数设为虚函数,那么当你在构造父类的构造函数时就不得不显示的调用构造。还有一个原因就是为了防错,试想如果你在子类中一不小心重写了个跟父类构造函数一样的函数,那么你的父类的构造函数将被覆盖,也即不能完成父类的构造.就会出错。解释二:虚函数的意思就是开启动态绑定,程序会根据对象的动态类型来选择要调用的方法。然而在构造函数运行的时 阅读全文
posted @ 2013-09-08 21:16 jiayouwyhit 阅读(347) 评论(0) 推荐(0) 编辑
摘要:铁律一:最好不要在构造函数和析构函数中调用虚函数!构造派生类对象时,首先调用基类构造函数初始化对象的基类部分。在执行基类构造函数时,对象的派生类部分是未初始化的。实际上,此时的对象还不是一个派生类对象。析构派生类对象时,首先撤销/析构他的派生类部分,然后按照与构造顺序的逆序撤销他的基类部分。因此,在运行构造函数或者析构函数时,对象都是不完整的。为了适应这种不完整,编译器将对象的类型视为在调用构造/析构函数时发生了变换,即:视对象的类型为当前构造函数/析构函数所在的类的类类型。由此造成的结果是:在基类构造函数或者析构函数中,会将派生类对象当做基类类型对象对待。而这样一个结果,会对构造函数、析构函 阅读全文
posted @ 2013-09-08 16:39 jiayouwyhit 阅读(1914) 评论(0) 推荐(0) 编辑
摘要:一般情况下如果自己不定义赋值构造函数及赋值操作符函数,C++会给生成默认的,对于基本数据类型一般没啥问题,但是对于指针或是对象了就有些问题,需要自己写。《C++ primer》关于自己定义派生类复制构造函数和赋值操作符有介绍。自己总结如下:如果没有必要自己写复制构造函数和赋值操作符,那就可以用系统默认的,能够很好的完成要求;但是一旦决定要自己显式定义,则该定义将完全覆盖默认定义。对派生类进行复制构造时,如果想让基类的成员也同时拷贝,就一定要在派生类复制构造函数初始化列表中显示调用基类复制构造函数(当然在函数体内将基类部分的值拷贝也是可以的,只不过它是先用默认构造函数初始化后再修改的基类成员变量 阅读全文
posted @ 2013-09-08 14:24 jiayouwyhit 阅读(2464) 评论(0) 推荐(0) 编辑
摘要:本文转载于http://blog.csdn.net/chenyiming_1990/article/details/8981868新加内容提醒:关于利用virtual函数实现动态绑定/多态,需要尤其注意的一点是: 必须保证基类和派生类中对应的虚函数除了函数名称一致之外,还必须保证形参和返回值也完全一致! 若基类和派生类中仅仅是虚函数的函数名称一致,但是形参不一致,则无法实现动态绑定/多态!实际上造成的结果是:派生类中对基类中对应的函数进行了隐藏,在派生类中只能访问派生类中的该函数,在基类中只能访问基类中对应的同名函数。针对基类和派生类中的虚函数有没有默认实参问题进行讨论。1.基类虚函数不带.. 阅读全文
posted @ 2013-09-07 17:41 jiayouwyhit 阅读(551) 评论(0) 推荐(0) 编辑
摘要:不能作为重载函数的调用的依据是( )A.参数个数 B.参数类型 C.函数类型 D.函数名称答案为C.重载函数的定义是:出现在相同作用域中的两个函数,如果具有相同的函数名字而形参的类型或者个数不同,则称为重载函数。对比定义,则A,B,D均为重载函数调用的依据。有人解释C选项时,说是因为“函数类型==函数返回值的类型”。这个解释是牵强附会的,尽管说“不能将函数返回值类型不同而作为函数重载的依据”,但是,由此而说“函数类型==函数返回值的类型”,这个在本质上是错误的。关于函数类型,参见资料:http://blog.csdn.net/amossavez/ar... 阅读全文
posted @ 2013-09-07 10:17 jiayouwyhit 阅读(178) 评论(0) 推荐(0) 编辑
摘要:本文转自http://blog.csdn.net/whyglinux/article/details/602329类的成员函数后面加 const,表明这个函数不会对这个类对象的数据成员(准确地说是非静态数据成员)作任何改变。在设计类的时候,一个原则就是对于不改变数据成员的成员函数都要在后面加 const,而对于改变数据成员的成员函数不能加 const。所以 const 关键字对成员函数的行为作了更加明确的限定:有 const 修饰的成员函数(指 const 放在函数参数表的后面,而不是在函数前面或者参数表内),只能读取数据成员,不能改变数据成员;没有 const 修饰的成员函数,对数据成员则是 阅读全文
posted @ 2013-09-05 15:35 jiayouwyhit 阅读(311) 评论(0) 推荐(0) 编辑
摘要:第一:private, public, protected 访问标号的访问范围。假如我们约定:类内部-----指的是当前类类型的定义中,以及其成员函数的声明和定义中;类外部-----指的是不在当前类“类内部”的地方,如主函数中,其他不具有继承关系的类定义中。友元函数----包括3种:设为友元的普通的非成员函数;设为友元的其他类的成员函数;设为友元类中的所有成员函数。private:只能在:(1)当前类的类内部;(2)友元函数中使用。protected:只能在:(1)当前类的类内部;(2)在当前类的派生类的类内部中;(3)该类的友元函数中使用。public:可以在任意地方使用。例如:可以被1.该 阅读全文
posted @ 2013-09-04 16:12 jiayouwyhit 阅读(344) 评论(0) 推荐(0) 编辑
摘要:本文转自http://www.programlife.net/cpp-explicit-keyword.html。其实explicit主要用于防止隐式转换,用于修饰构造函数、复制构造函数[注意:一般推荐对构造函数使用explicit修饰,而对赋值构造函数不推荐使用explicit修饰]。比如,下面的代码编译不会出错:#include using namespace std;class Demo{private: int value;public: Demo():value(0){} Demo(int val):value(val){} Demo(const Demo& d):value 阅读全文
posted @ 2013-09-04 15:17 jiayouwyhit 阅读(206) 评论(0) 推荐(0) 编辑
摘要:1、使用static类的优点: (1)避免与其他类的成员或者全局变量冲突 (2)可以封装 (3)阅读性好 2.static 数据成员独立于该类的任意对象而存在 static数据成员的类型可以是该成员所属的类类型。非static成员被限定声明为其自身类对象的指针或引用。 class Bar{ public: // private: static... 阅读全文
posted @ 2013-09-02 13:20 jiayouwyhit 阅读(715) 评论(0) 推荐(0) 编辑
摘要:本文转自http://blog.csdn.net/lwbeyond/article/details/6202256一. 什么是拷贝构造函数首先对于普通类型的对象来说,它们之间的复制是很简单的,例如:[c-sharp]view plaincopyinta=100;intb=a;而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量。下面看一个类对象拷贝的简单例子。[c-sharp]view plaincopy#includeusingnamespacestd;classCExample{private: inta;public://构造函数 CExample(intb) {a=b; 阅读全文
posted @ 2013-09-02 00:13 jiayouwyhit 阅读(219) 评论(0) 推荐(0) 编辑
摘要:1. 函数调用约定 关于 C/C++ 函数调用约定,大多数时候并不会影响程序逻辑,但遇到跨语言编程时,了解一下还是有好处的。 VC 中默认调用是 __cdecl 方式,Windows API 使用 __stdcall 调用方式,在 DLL 导出函数中,为了跟Windows API 保持一致,建议使用 __stdcall 方式。 调用约定跟堆栈清除密切相关。如果写一个汇编函数,给 C/C++ ... 阅读全文
posted @ 2013-08-28 23:07 jiayouwyhit 阅读(676) 评论(0) 推荐(0) 编辑
摘要:非本人作也!因非常经典,所以收归旗下,与众人阅之!原作者不祥! 堆和栈的区别 一、预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS... 阅读全文
posted @ 2013-08-28 11:07 jiayouwyhit 阅读(179) 评论(0) 推荐(0) 编辑
摘要:指针数组,故名思义,就是指针的数组,数组的元素是指针; 数组指针,同样,就是直想数组的指针。 简单举例说明: int *p[2]; 首先声明了一个数组,数组的元素是int型的指针。 int (*p)[2]; 声明了一个指针, 指向了一个有两个int元素的数组。 其实这两种写法主要是因为... 阅读全文
posted @ 2013-08-15 16:00 jiayouwyhit 阅读(315) 评论(0) 推荐(0) 编辑
摘要:本文主要介绍va_start和va_end的使用及原理。 在以前的一篇帖子Format MessageBox 详解中曾使用到va_start和va_end这两个宏,但对它们也只是泛泛的了解。 介绍这两个宏之前先看一下C中传递函数的参数时的用法和原理: 1.在C中,当我们无法列出传递函数的所有实参的类型和数目时,可以用省略号指定参数表 void foo(...); ... 阅读全文
posted @ 2013-08-13 10:38 jiayouwyhit 阅读(646) 评论(0) 推荐(0) 编辑
摘要:最近看网上帖子时,看到一位网友提到的一个有意思的问题: int main() { float a; a=1.1; } 当我编译这样一段程序,VC会提示:warning C4305: '=' : truncation from 'const double ' to 'float '。 ... 阅读全文
posted @ 2013-08-09 16:07 jiayouwyhit 阅读(572) 评论(0) 推荐(0) 编辑
摘要:1. 函数使用概况 assert宏能测试传入表达式的真假值,当表达式为真(true),则不会有任何反应;当表达式为假(false),则函数将输出错误信息,并中断程序的执行。 assert宏可以用来判断某表达式的真假值,并在程序执行的过程中实时响应错误信息,因此在程序开发的过程中,常常被用来作程序纠错的工具,当程序开发完成,只需要在加载头文件前面,利用#define指令定义NDEBUG这个关键字... 阅读全文
posted @ 2013-08-08 09:03 jiayouwyhit 阅读(483) 评论(0) 推荐(0) 编辑