
C/C++语言
文章平均质量分 70
imxiangzi
这个作者很懒,什么都没留下…
展开
-
C语言中的柔性数组 C语言结构体中char[0]和char[1]的用法
1.写在前面我在进行Linux 64位驱动程序兼容32位应用程序的适配过程中,深深的感觉指针操作带来的麻烦,特别是应用层的32位指针传到内核层后,指针大小变成64位,需要进行频繁的大小调整,及其难受。等我快完成所有工作的时候,听一位同事说可以使用char[0]用法来代替指针,我差点一口老血喷出来。“你咋不早说…”。接下来从网上各种google,发现了这种用法的巧妙,特写下此篇文章,以做记录。...转载 2019-06-03 20:32:09 · 4906 阅读 · 2 评论 -
显式调用构造函数和析构函数
今天跟同事聊天,他说到STL源码有用到显示调用析构函数。试一了一下。果然能行。#include iostream>usingnamespace std;class MyClass{public:MyClass(){cout "Constructors" endl;}~MyClass(){cout "Destructors" endl;转载 2015-10-28 21:22:44 · 858 阅读 · 0 评论 -
类的数组成员变量的初始化
使用STL标准模板库之后,编程时已经很少使用数组和指针,相反,多使用序列容器vector代替之。但事实并不这么理想,在迫不得已的情况下,我们还是会选择使用数组。这里介绍一下当数组作为类的成员变量时,应该怎么对它(数组)进行初始化。在类的构造函数中可以使用成员初始化表初始化各个成员变量,这种方法是很受推荐和赞扬的,因为使用成员初始化表中对成员进行初始化和在构造函数体中对成员赋转载 2015-10-29 13:12:19 · 7119 阅读 · 3 评论 -
c++虚继承对象的内存布局
c++虚继承对象的内存布局 --VC7.1特别版网上关于c++对象布局的文章挺多,而且《深度探索c++对象模型》(Inside The C++ Object Model 侯捷 译)一书中也很详细地介绍。如果你一点都不了解C++对象的布局,我推荐你看看《深度探索c++对象模型》的第三章,如果你意犹未尽下面的两个系列都很不错:一是陈皓的《C++ 对象的内存布转载 2015-10-28 22:23:18 · 403 阅读 · 0 评论 -
C++中虚析构函数的作用
我们知道,用C++开发的时候,用来做基类的类的析构函数一般都是虚函数。可是,为什么要这样做呢?下面用一个小例子来说明: 有下面的两个类:class ClxBase{public: ClxBase() {}; virtual ~ClxBase() {}; virtual void DoSomething() { cout "Do转载 2015-10-28 23:23:31 · 373 阅读 · 0 评论 -
c++涉及继承和虚继承时的内存布局
原文地址:c++涉及继承和虚继承时的内存布局 作者:风箫夜吟今天是清明节假期的第二天,天气阴沉,无心于游玩,遂决定宅于实验室。现在来说每天拜读一下大牛的博客已成生活中不可或缺之乐趣!但是俗话说的好:”光说不练假把式!“,今天拜读了浩哥的博客,感触颇多,于是就产生了本篇博文!目的主要还是总结一下自己看到和想到的一些东西,以及遇到的一些问题,关于文中提出的问题受本人水平所限转载 2015-10-28 22:18:58 · 380 阅读 · 0 评论 -
C++虚析构函数、纯虚析构函数
虚析构函数析构函数的工作方式是:最底层的派生类(most derived class)的析构函数最先被调用,然后调用每一个基类的析构函数。因为在C++中,当一个派生类对象通过使用一个基类指针删除,而这个基类有一个非虚的析构函数,则结果是未定义的。运行时比较有代表性的后果是对象的派生部分不会被销毁。然而,基类部分很可能已被销毁,这就导致了一个古怪的“部分析构”对象,这是一个泄漏资源。排除转载 2015-10-28 23:22:48 · 639 阅读 · 0 评论 -
虚函数在对象中的内存布局
典型地,C++通过虚函数实现多态性。多态性的定义:“无论发送消息的对象属于什么类,他们均发送具有相同形式的消息,对消息的处理方式可能随接受消息的对象而变。”具体地说,“在某个基类上建立起来的类的层次结构中,可以对任何一个派生类的对象中的同名成员函数进行调用,而被调用的成员变量所提供的处理可以随其所属的类而改变。”虚函数首先是一种成员函数,它可以在该类的派生类中被重新定义并被赋予另外一种处理功能。转载 2015-10-28 22:08:07 · 642 阅读 · 0 评论 -
C++ 私有构造函数的作用
很多情况下要求当前的程序中只有一个object。例如一个程序只有一个和数据库的连接,只有一个鼠标的object。通常我们都将构造函数的声明置于public区段,假如我们将其放入private区段中会发生什么样的后果?这意味着什么? 当我们在程序中声明一个对象时,编译器为调用构造函数(如果有的话),而这个调用将通常是外部的,也就是说它不属于class对象本身的调用,假如构造函数是私转载 2015-10-28 21:24:15 · 477 阅读 · 0 评论 -
私有构造函数
私有构造函数是一种特殊的实例构造函数。它通常用在只包含静态成员的类中。如果类具有一个或多个私有构造函数而没有公共构造函数,则不允许其他类(除了嵌套类)创建该类的实例。例如:class NLog { // Private Constructor: private NLog() {} public static double e = 2.71828;}声明空构造函数转载 2015-10-28 21:23:25 · 2954 阅读 · 2 评论 -
C语言的不完整类型和前置声明
声明与定义(Declaration and Definition)开始这篇文章之前,我们先弄懂变量的declaration和definition的区别,即变量的声明和定义的区别。一般情况下,我们这样简单的分辨声明与定义的区别:建立存储空间的声明称之为“定义”,而把不需要建立存储空间的称之为“声明”。其实更为准确地描述的话,变量的声明可以分为两种情况:(1)一种是需要建立存储空间的。转载 2015-10-27 21:43:30 · 1006 阅读 · 0 评论 -
有些运行符不能重载为友元函数,它们是:=,(),[]和->。
原因:有人说是因为C++规定赋值运算符“=”只能重载为类的非静态成员函数,而不可以重载为类的友元函数。不能重载为类的静态成员应该比较容易理解,因为静态成员函数是属于整个类的,不是属于某个对象的,它只能去操作类静态数据成员。而赋值运算符“=”是基于对象操作的。当把赋值运算符重载为类的友员函数,在程序中执行类对象的赋值语句时,程序就会出现两种矛盾的选择。(1)因为它认为转载 2015-10-13 00:14:25 · 4346 阅读 · 0 评论 -
不能重载的运算符只有5个:
(2)C++允许重载的运算符C++中绝大部分运算符都是可以被重载的。不能重载的运算符只有5个:. (成员访问运算符).* (成员指针访问运算符):: (域运算符)sizeof (长度运算符)?: (条件运算符)前两个运算符不能重载是为了保证访转载 2015-10-13 00:09:36 · 16523 阅读 · 0 评论 -
虚函数在对象中的内存布局
典型地,C++通过虚函数实现多态性。多态性的定义:“无论发送消息的对象属于什么类,他们均发送具有相同形式的消息,对消息的处理方式可能随接受消息的对象而变。”具体地说,“在某个基类上建立起来的类的层次结构中,可以对任何一个派生类的对象中的同名成员函数进行调用,而被调用的成员变量所提供的处理可以随其所属的类而改变。”虚函数首先是一种成员函数,它可以在该类的派生类中被重新定义并被赋予另外一种处理功能。转载 2015-10-27 22:19:31 · 339 阅读 · 0 评论 -
c++类继承的成员可见性
1 -- C++继承机制的相关知识点继承机制,就是利用已有的数据类型来定义新的数据类型,新数据类型将拥有基类的成员。派生类可以从一个基类派生,也可以从多个基类派生。从一个基类派生的继承称为单继承;从多个基类派生的继承称为多继承。单继承语法:class :{//派生类新定义成员}; 多继承语法:class :,,......{//派生类新定义成员}; 2 -- 继转载 2015-10-26 23:05:34 · 740 阅读 · 0 评论 -
关于C++中的前置声明
今天一朋友问及C++中的前置声明问题,下面是我给出的回答。 在编写C++程序的时候,偶尔需要用到前置声明(Forward declaration)。下面的程序中,带注释的那行就是类B的前置说明。这是必须的,因为类A中用到了类B,而类B的声明出现在类A的后面。如果没有类B的前置说明,下面的程序将不同通过编译,编译器将会给出类似“缺少类型说明符”这样的出错提示。代码一:转载 2015-10-27 20:08:37 · 1353 阅读 · 0 评论 -
Const 重载解析(const参数重载 和 const成员函数重载)
书上和网上在很多地方都对const 的重载做了一些解释,但感觉都不是很详细。还有很多同学在不同的地方发问关于const 重载的问题,这里我又重新看了一下,做了一个简单的分析也可能有不对的地方,欢迎讨论。所谓重载,是指允许存在多个同名函数,而这些函数的参数表不同,即函数名相同但函数的签名不同。重载并不是面向对象编程的特有属性,这是因为重载是在编译阶段实现的,编译器根据函数不同的参数表,对同名函数转载 2015-10-27 13:34:39 · 1214 阅读 · 0 评论 -
重载前置,后置(自增运算符 ++ 和自减运算符 --)
如何重载增量运算符 ++ 和 --运算符++和--有前置和后置两种形式,如果不区分前置和后置,则使用operator++( )或operator--( )即可;否则,要使用operator++( )或operator--( )来重载前置运算符,使用operator++(int)或operator--(int)来重载后置运算符,调用时,参数int被传递给值0。对于“++”转载 2015-10-12 23:53:17 · 6386 阅读 · 0 评论 -
C++类内存分布
书上类继承相关章节到这里就结束了,这里不妨说下C++内存分布结构,我们来看看编译器是怎么处理类成员内存分布的,特别是在继承、虚函数存在的情况下。工欲善其事,必先利其器,我们先用好Visual Studio工具,像下面这样一步一步来: 先选择左侧的C/C++->命令行,然后在其他选项这里写上/d1 reportAllClassLayout,它可以看到转载 2015-10-28 22:08:58 · 444 阅读 · 0 评论 -
C++继承内存对象模型
最近研究了一下,C++继承的内存对象模型。主要是读了读http://blog.youkuaiyun.com/haoel/article/details/3081328(C++ 对象的内存布局)。很推荐这篇文章。 对这篇文章做了做总结。本文的大部分内容来自于这篇文章中的总结http://blog.youkuaiyun.com/haoel/article/details/3081328(C++转载 2015-10-28 22:22:42 · 398 阅读 · 0 评论 -
C语言 fread()与fwrite()函数说明与示例
1.作用 读写文件数据块。2.函数原型 (1)size_t fread ( void * ptr, size_t size, size_t count, FILE * stream ); 其中,ptr:指向保存结果的指针;size:每个数据类型的大小;count:数据的个数;stream:文件指针 函数返回读取数据的个数。 (2转载 2016-07-18 10:21:36 · 839 阅读 · 0 评论 -
移动构造-C++11
移动构造:移动构造是C++11标准中提供的一种新的构造方法。在现实中有很多这样的例子,我们将钱从一个账号转移到另一个账号,将手机SIM卡转移到另一台手机,将文件从一个位置剪切到另一个位置…… 移动构造可以减少不必要的复制,带来性能上的提升。有些复制构造是必要的,我们确实需要另外一个副本;而有些复制构造是不必要的,我们可能只是希望这个对象换个地方,移动一下而已。转载 2016-04-01 12:40:36 · 579 阅读 · 0 评论 -
一个隐式类型转换引起的重载函数二义性错误
介绍因为隐式类型转换而引起的一个非常隐晦的错误下述代码的目的是设计一个简单的类A,希望A的对象在标准输出和文件输出时的表现不同[cpp] view plaincopy#include #include using namespace std; class A { public:转载 2015-10-15 13:11:07 · 757 阅读 · 0 评论 -
设置浮点数精度(precision、setprecision)
在C++中可以人为控制浮点数的精度,也就是说可以用流操纵算子setprecision或成员函数percision控制小数点后面的位数。设置了精度以后,该精度对之后所有的输出操作都有效,直到下一次设置精度为止。无参数的成员函数percision返回当前设置的精度。图11.17中的程序用成员函数precision和流操纵算子setprecision打印出了2的平方根表,输出结果的精度从0连续变化到9。转载 2015-11-20 13:28:57 · 4514 阅读 · 0 评论 -
cout 格式化输出
将 cout 的 flag 保存到变量, 以便修改后的恢复 ostream::fmtflags old = cout.flag() ; // 无参将返回当前 flag 值 cout.flag(old) ; // 恢复到原先保存的值将 bool 值以 literals 输出cout "nu转载 2015-11-18 11:42:45 · 502 阅读 · 0 评论 -
c++文件結束符
一直奇怪下面一段程序怎樣才結束,按多少次回車也沒用。#includeint main(){ int amount=0,value; while(std::cin>>value) if(value0) ++amount; std::cout"Amount of all negative values read is"转载 2015-11-16 22:28:53 · 633 阅读 · 0 评论 -
C++系列目录
基础语言篇 C++数据类型 C位操作 C预编译处理 C指针 C结构体与枚举类型 C++函数 C++虚函数 C++容器与算法 C++类 C++I/O处理 C++重载操作符与转换 模板与泛型 C/C++ 编译和调试 C/C++动态链接 C/C++通转载 2015-11-16 23:31:16 · 596 阅读 · 0 评论 -
在C++中实现foreach循环,比for_each更简洁!
python,c#,java里面都有类似于foreach的结构,stl里面虽然有for_each这个函数,但是感觉使用还是太繁琐了一些,所以就自己实现了一个。 先来看看stl里面的for_each函数,官方文档上的原型如下:1Function for_each (InputIterator first, InputIterator last, Function f);示例代码如下:转载 2015-11-20 22:23:39 · 13009 阅读 · 2 评论 -
Qt Quick 事件处理之信号与槽
前面两篇文章《QML 语言基础》和《Qt Quick 简单教程》中我们介绍了 QML 语言的基本语法和 Qt Quick 的常见元素,亲们,通过这两篇文章,您应该已经可以完成简单的 Qt Quick 应用了。接下来呢,哈,我们要介绍 Qt Quick 中一个灰常灰常重要的主题:事件处理。这将是比较长长长长的一篇,哦,不还有后续好几篇……废话少说,还是谈正事儿吧兄弟姐妹们。 本文是转载 2015-10-15 20:28:06 · 952 阅读 · 0 评论 -
C++ 虚函数表解析
C++ 虚函数表解析 陈皓http://blog.youkuaiyun.com/haoel 前言 C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,R转载 2015-10-28 22:24:27 · 320 阅读 · 0 评论 -
c++继承中的内存布局(转)
今天在网上看到了一篇写得非常好的文章,是有关c++类继承内存布局的。看了之后获益良多,现在转在我自己的博客里面,作为以后复习之用。——谈VC++对象模型(美)简.格雷程化 译译者前言一个C++程序员,想要进一步提升技术水平的话,应该多了解一些语言的语意细节。对于使用VC++的程序员来说,还应该了解一些VC++对于C++的诠释。 Inside the C++ O转载 2015-10-28 22:03:05 · 382 阅读 · 0 评论 -
C++ 对象的内存布局(下)
C++ 对象的内存布局(下) 陈皓http://blog.youkuaiyun.com/haoel <<<点击这里查看上篇 重复继承 下面我们再来看看,发生重复继承的情况。所谓重复继承,也就是某个基类被间接地重复继承了多次。 下图是一个继承图,我们重载了父类的f()函数。 其类继承的源代码如下所示。其中,每个类都有两个变量,一个是整形(4字节转载 2015-10-28 22:26:37 · 367 阅读 · 0 评论 -
Qt C++中的关键字explicit
最近在复习QT,准备做项目了,QT Creator 默认生成的代码 explicit Dialog(QWidget *parent = 0)中,有这么一个关键字explicit ,用来修饰构造函数。以前在Windows下写程序的时候,基本上没有碰到这个关键字,那么这个关键字是做什么用的呢? 关键字 explicit 可以禁止“单参数构造函数”被用于自动类型转换。光看这一句似乎不太转载 2015-10-15 13:07:18 · 389 阅读 · 0 评论 -
从Qt谈到C++(一):关键字explicit与构造函数
原文 http://blog.youkuaiyun.com/guodongxiaren/article/details/24455653主题 Qt提出疑问当我们新建了一个Qt的widgets应用工程时。会自动生成一个框架,包含了几个文件。其中有个mainwindow.h的头文件。就是你要操纵的UI主界面了。我们看看其中的一段代码:class MainWindow : pu转载 2015-10-15 13:06:45 · 579 阅读 · 0 评论 -
C++取a到b之间的随机数
计算机的随机数都是由伪随机数,即是由小M多项式序列生成的,其中产生每个小序列都有一个初始值,即随机种子。(注意:小M多项式序列的周期是65535,即每次利用一个随机种子生成的随机数的周期是65535,当你取得65535个随机数后它们又重复出现了。) 我们知道rand()函数可以用来产生随机数,但是这不是真正意义上的随机数,是一个伪随机数,是根据一个数(我们可以称它为种子)为基准以转载 2015-10-14 12:44:40 · 7309 阅读 · 0 评论 -
C++类成员和数据成员初始化总结
C++为类中提供类成员的初始化列表类对象的构造顺序是这样的:1.分配内存,调用构造函数时,隐式/显示的初始化各数据成员2.进入构造函数后在构造函数中执行一般计算 1.类里面的任何成员变量在定义时是不能初始化的。 2.一般的数据成员可以在构造函数中初始化。 3.const数据成员必须在构造函数的初始化列表中初始化。 4.static要在类的定义外面初始化。转载 2015-10-29 13:09:54 · 566 阅读 · 0 评论 -
C++ 对象的内存布局(上)
C++ 对象的内存布局(上) 陈皓http://blog.youkuaiyun.com/haoel 点击这里查看下篇>>>前言 07年12月,我写了一篇《C++虚函数表解析》的文章,引起了大家的兴趣。有很多朋友对我的文章留了言,有鼓励我的,有批评我的,还有很多问问题的。我在这里一并对大家的留言表示感谢。这也是我为什么再写一篇续言的原因。因为,在上一篇文章中,我用了的示例都是非转载 2015-10-28 22:25:06 · 378 阅读 · 0 评论 -
谈谈:C++类的“包含”机制
本人在学习Qt的时候发现了一个非常有趣的现象。有很多函数的调用方法都写成了如下的形式:object.func().func2(); 这令小弟着实不懂。在上面这段代码中,第一个对象调用它的成员函数func()是完全没有问题的,但是后面那个func2()就奇怪了。我们只知道,点运算符(.)的作用就是调用对象的成员,但是如转载 2015-10-27 22:20:37 · 579 阅读 · 0 评论 -
两个C++编译异常及解决方法-does not name a type和field `XX' has incomplete type
两个C++编译错误及解决办法--does not name a type和field `XX' has incomplete type 编译错误一:XX does not name a type 编译错误二:field `XX' has incomplete type 编译错误一:XX does not name a type, 中文意思为“XX没有命名一个类型“拿个转载 2015-10-27 21:40:16 · 6004 阅读 · 0 评论 -
struct和typedef struct彻底明白了
struct和typedef struct分三块来讲述: 1 首先://注意在C和C++里不同 在C中定义一个结构体类型要用typedef: typedef struct Student { int a; }Stu; 于是在声明变量的时候就可:Stu stu1;(如果没有typedef就必须用struct Student s转载 2015-09-01 11:06:54 · 341 阅读 · 0 评论