![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
yby4769250
C C python linux.
展开
-
纯虚析构函数
纯虚析构函数和普通纯虚函数的区别在于,纯虚析构函数需要提供函数的实现,而一般纯虚函数不能有实现,这样的原因在于,纯虚析构函数最终需要被调用,以析构基类对象,虽然是抽象类没有实体。而如果不提供该析构函数的实现,将使得在析构过程中,析构无法完成而导致析构异常的问题Calss A{ public: A(){} virtual ~A()=0;}A::~A(){}原创 2012-02-26 01:19:38 · 7507 阅读 · 6 评论 -
编程规范之--变量
1、现在存在两种比较流行的命名方法,匈牙利命名法或者unix like命名法,选择适合自己的。2、全局变量前加g_,静态变量前加s_,突出,使调用者倍加小心3、使用常量时,尽量使用const变量代替宏定义,“尽量使用编译器而不使用预编译器”,因为宏定义在预编译阶段已经被展开,宏符号无法进入编译阶段,而且宏展开没有类型信息,无法做类型安全检查,一旦出错,难以找到错误的出处,而如果按照常量来定原创 2012-03-21 14:46:17 · 888 阅读 · 0 评论 -
理解“从规则上实现”和“从技术上实现”的不同
如前面一篇文章中提到的,为了实现模块的私有,私有的东西应当放在源文件中声明定义,这样就不会直接暴露公开给外部,这里有两个说法:1、如果这些定义没有加static限制,则这样的设计只是从规则上实现了变量的私有,因为在源文件中的声明只是表明它的语义,并且设定规则:这些变量是私有的,“不应该在外部模块引用”。但是,实际上并没有阻止别人的访问,因为别的文件内是可以引用得到的,如果某些新来的不熟悉团队规原创 2012-03-21 14:16:55 · 1113 阅读 · 0 评论 -
编程规范之--头文件
依赖:如果a.h包含了b.h则成a依赖b,当b修改时,直接包含了b或者包含了a(间接包含了b)的源文件都需要重新编译,如果a修改了,则包含了a的源文件要重新编译。1、尽量不要在头文件中包含头文件(库文件另外讨论,因为库文件不会被修改),以减少文件间的依赖关系,使得文件的耦合度降低2、头文件中只适宜放置对外接口或者变量的声明,而不能放置定义或者实现。因为当头文件被多个源文件包含时,会产生多个原创 2012-03-21 14:07:24 · 1662 阅读 · 0 评论 -
数组名和指针的区别
近段时间在整理自己大学几年来学习C++的点点滴滴,写这篇文章源于看林锐博士的《高质量C++指南》时,看到文章直接把指针和数组名视为同一东西,原文为“数组名本身就是一个指针,是一个指针常量,即a等价于int * const a,因此你不能试图修改数组名的值”,摘自第三版127页第7.2.1小节。 自己初学C++时也被数组和指针搞得昏头转向过,通过多方求证和对比实验已把指针和数组弄得稍明白,原创 2012-02-26 01:04:56 · 38104 阅读 · 31 评论 -
C++变量和对象的区别联系
对象和变量这两个概念莫要搞乱,颈是颈,椎是椎,虽然两者都对应着一块内存,但是从不同的角度去理解内存就会产生不同的意义。变量:所谓变量就是一种定义,通过定义编译器将会开辟一段空间,并将这段内存空间和这个变量的名字捆绑在一起。从这个意思去理解,其实说白了:变量名就是内存在代码中可视化的一个符号。也就是说,如int a,a只是内存中某段地址在代码中可视化的一个符号,a本身作为符号并不占用空间原创 2012-03-21 13:15:34 · 8339 阅读 · 1 评论 -
C/C++ 中的0长数组(柔性数组)
在标准C和C++中0长数组如charArray[0]是不允许使用的,因为这从语义逻辑上看,是完全没有意义的。但是,GUN中却允许使用,而且,很多时候,应用在了变长结构体中,如:StructPacket{Int state;Int len;Char cData[0]; //这里的0长结构体就为变长结构体提供了非常好的支持}; 首先对0长数组做一个解释:原创 2012-02-26 01:03:34 · 23148 阅读 · 4 评论 -
C++常量折叠
今天回顾了大学这几年学习C++的点点滴滴,在回顾了“常量折叠”这里时,突然困惑了,当时学习这点知识时的理解是:可折叠的常量像宏一样,在预编译阶段对常量的引用一律被替换为常量所对应的值,就和普通的宏替换没什么区别,并且,编译器不会为该常量分配空间。现在回顾起来,当时是多么的天真,被现象迷惑了,常量折叠确实会像宏一样把对常量的引用替换为常量对应的值,但是,并非不给该常量分配空间,如下代码:#d原创 2012-03-16 03:07:27 · 12519 阅读 · 21 评论 -
C/C++编译和链接过程详解 (重定向表,导出符号表,未解决符号表)
详解link 有 些人写C/C++(以下假定为C++)程序,对unresolved external link或者duplicated external simbol的错误信息不知所措(因为这样的错误信息不能定位到某一行)。或者对语言的一些部分不知道为什么要(或者不要)这样那样设计。了解本文之后, 或许会有一些答案。 首先看看我们是如何写一个程序的。如果你在使用某种IDE(Visu转载 2012-03-16 13:06:36 · 12366 阅读 · 6 评论 -
C++重载类型转换操作符
在需要做数据类型转换时,一般显式的写法是:type1 i;type2 d;i = (type1)d; //显式的写类型转,把d从type2类型转为type1类型这种写法不能做到无缝转换,也就是直接写 i = d,而不需要显式的写(type1)来向编译器表明类型转换,要做到这点就需要介绍一下“类型转换操作符”,拿最简单的基本类型封包解包来举例:class Integer{publ原创 2012-03-08 13:40:16 · 23808 阅读 · 4 评论 -
面向对象编程的精髓在于将行为绑定在数据上
"面向对象编程的精髓在于将行为绑定在数据上"这句话是经典的,因为我们都知道,面向对象的思想是从面向过程编程中发展而来的,而在早期的面向过程编程语言中,程序是由一组结构体和操作该结构体对象的函数组成,并且,结构体和函数是分开的,离散的,通过在函数参数列表中声明一个结构体指针来和结构体产生关联,这样的关联关系使得数据和函数之间的的关系不够明显清晰,比如:Structtask_struct{原创 2012-02-27 01:26:04 · 1963 阅读 · 0 评论 -
虚析构函数
Class A{}ClassB:public A{}ClassC:public B{} 在一般的使用下,如C c;如果存在继承派生关系,当构造一个子类对象时,会先从最上层先调用基类的构造函数构造基对象,然后逐步往下,最后调用子类的构造函数完成子类对象的构造,而当销毁子类对象时,会按照相反顺序,先调用子类的析构函数,然后调用基类的析构函数,最后完成一个对象的析构。注意,这是正常的原创 2012-02-26 01:06:17 · 1448 阅读 · 0 评论 -
面向对象的设计原则
在经历了几个项目之后,对设计的重要性体会更加深刻,并且当项目稍大时,面向对象的感觉就越差,在搭建了框架之后,常常不能严格的面向对象,在某个地方需要一些额外的功能时,不是加函数就是加辅助类,设计完全被打破,使得耦合度增加,后期难以理解和维护。面向对象简单的讲就是将数据和行为捆绑在一起。因此,一个对象首先拥有数据(属性),然后才有行为(用来访问活修改对象的属性),因此,编码中常常出现的一个困扰是(原创 2012-03-21 17:10:00 · 936 阅读 · 0 评论