
C/C++
东大学子
Talk is cheap. Show me the code.
展开
-
浅析C/C++作用域之全局变量
楼主今天遇到一件很蛋疼的事,写了不到30行代码居然出错,尼玛气人的是半天找不到原因,真是少壮不努力老大徒伤悲啊!废话少说,先看代码:(IDE=vs2010)Head.h#ifndef HEAD_H //编译预处理,避免多次包含#define HEAD_H struct Node{int data;};Node Dt; //定义结构体变量。原创 2013-06-15 20:23:00 · 1383 阅读 · 0 评论 -
文件操作之不得不知的细节
文件操作之不得不知的细节说道文件操作,可能很多人都或多或少知道一些,但是你是否曾遇到一些莫名其妙的问题呢,你是否了解如何真正正确的判断是否读到文件末尾呢(!f.eof()----to young, to simple),你是否真正了解seekp()/seekg()/tellg()/tellp()呢?如果这些你都明白了,那么这篇文章你就不需要看了。但是如果你还不太明白,我们就一起探讨一下:说原创 2013-11-09 01:32:16 · 1921 阅读 · 0 评论 -
C++编译优化之RVO(Return Value Optimization) &&C++直接初始化与赋值初始化的区别
在C++中有一类构造函数除了能显示调用以外,还可以被编译器隐式调用:带一个参数的构造函数------------默认隐式转换器。1, 上例中如果去掉explicit关键字,那么B w = j;就会隐式调用B(int*).2, 同样用“=“初始化时,是隐式调用拷贝构造函数。如果拷贝构造函数加上explicit,赋值初始化将被禁用。3, 赋值操作时,调用的是“operator=“。严格意义上来讲,带一个参数的构造函数是构造器&&隐式转换器,而构造函数是构造器&&拷贝器&&原创 2013-11-13 21:08:12 · 1712 阅读 · 0 评论 -
windows 下实现函数打桩:拦截API方式
1. 函数调用的原理:通过函数名(函数的入口地址)对函数进行访问,假设我们能够改变函数首地址指向的内存的话,使其跳转到另一个函数去执行的话,那么就可以实现函数打桩了。2. 方法:对函数首地址出写入一条汇编语言 jmp xxx (其中xxx是要跳转的相对地址)。3. 令原函数为oldFun,新函数为newFun,那么打桩时函数跳转的相对地址 offset = newFun - oldFun - (我们制定的这条指令的大小),此处为绝对跳转指令的长度=5。 jmp xxx一共6字节。原创 2014-07-19 05:39:19 · 2694 阅读 · 0 评论 -
windows库的创建和使用:静态库+动态库
一、静态库的创建和使用1. 静态库创建(1)首先创建工程test,测试代码如下:1) test.hvoid test_print();2) test.cpp#include "test.h"#include void test_print(){printf("test_print in static lib."原创 2014-07-19 03:49:59 · 2159 阅读 · 0 评论 -
C++ 复制函数
C++ 复制函数 说道C++复制函数,大家也许并不陌生,就是类中的拷贝构造函数和赋值操作符,但是事实上也许我们一不小心就会忽略编译器所做的一些默认操作。引起晦涩的错误。下面分析几种场景:一、场景一:全部默认#includeclass base{public: base(){} base(int dt):data(dt){} void get(){pri原创 2014-07-20 20:47:16 · 1604 阅读 · 0 评论 -
C和C++中const的区别
C中的const,功能比较单一,较容易理解: 作用:被修饰的内容不可更改。 使用场合: 修饰变量,函数参数,返回值等。(c++中应用场合要丰富的多) 特点: 是运行时const,因此不能取代#define用于成为数组长度等需要编译时常量的情况。同时因为是运行时const,可以只定义而不初始化,而在转载 2014-08-19 10:52:56 · 616 阅读 · 0 评论 -
C++ 构造函数:初始化列表(困惑之源之一)
1、STL容器中不能存储引用类型,原因是引用并非对象,而是对象的别名,且STL中的元素需要支持赋值操作符,而引用只支持初始化,不支持赋值操作符,同理数组中也无法存储引用类型,形如int& a[n],无疑是错的。2、在构造函数中我们来看一个有趣的问题:示例 1:class test{public:test():size(10),base(new char[size原创 2014-08-06 17:48:13 · 823 阅读 · 0 评论 -
C/C++数据对齐总结
C/C++数据对齐总结原创 2014-08-19 11:33:45 · 1644 阅读 · 0 评论 -
函数参数的获取:嵌入汇编的方法
函数参数的获取:嵌入汇编的方法通常我们能够想到的函数参数有两种,一种是显示的定长参数,还有就是变长,这两种方式都有各自的捞取参数的方法,但是如果是定长参数却没有参数名该怎么办呢,这节我们就是要讨论一下这个问题,这个尽管在大多数情况下使用不上,但是有时候还是大有用武之地,改文也是为: 深入探讨this指针:从汇编的角度考虑做铺垫的。该文测试环境:VS2010 (win原创 2014-08-19 17:46:21 · 2067 阅读 · 0 评论 -
深入探讨this指针:从汇编的角度考虑
深入探讨this指针:从汇编的角度考虑总结:至此我们对this指针和成员函数调用有了更进一步的认识,(1) this 指针只存在于成员函数内部,(2) 成员函数的调用时,this指针并没有那么神秘,那完全可以认为对象在调用成员函数时将自身地址作为函数的第一个参数在默认情况下传递给了函数的默认形参,只不过这个默认形参被命名为this罢了,仅此而已,小样,不就是穿了一个马甲吗!(3) 尽管我们可以把this指针当做成员函数的第一个默认参数,但是我们心里应该明白,事实上它还是有点特殊待遇的,它与正常的函数原创 2014-08-19 16:59:17 · 3327 阅读 · 0 评论 -
C++虚函数的实现机制
说起虚函数想必大家不会陌生,这可是多态的实现基础,没有它就白瞎了。多态也就是运行时绑定,个人对静态和动态语言之间的差别研究不深,但在鄙人看来,其实动态语言也没有那么神奇的,静态语言只不过是代码区的调用在编译期就已经完全绑定了,而动态函数可以实现在运行期动态绑定。能在运行期动态绑定必然是好的,可以提供更大的灵活性,但是天下没有免费的午餐,想要动态绑定必然需要耗费额外的空间存储一些额外的用于动态跟踪的信息和额外的绑定时间。从后面的对虚函数实现机制中我们可以窥其一二。原创 2014-08-20 14:41:12 · 1123 阅读 · 0 评论 -
内存映射
内存映射文件原创 2014-08-24 14:38:06 · 617 阅读 · 0 评论 -
C++构造函数:初始化的那些事
结论:(1) 在构造对象的同时,构造函数会企图初始化所有成员变量,当指定了显示的初始化方式则按指定方式初始化,否则调用其所属类的默认构造函数或者无参构造函数进行隐式初始化,如果是内置类型,则跟对象是否为局部变量相同,其初始化行为就好像是在当前声明对象的作用域单独声明该变量一样。(2)按照(1)的结论,为了使得我们的类支持隐式初始化,必须提供隐式初始化所需要的机制,那就是要么类有缺省构造函数,要么为其提供一个无参构造函数。(3)在继承关系的初始化规则中,无论何种情况,基类总是需要被构造的,当你显示指定其原创 2014-08-06 17:36:45 · 1058 阅读 · 0 评论 -
华为介绍-应届生必看
说一下华为外派常驻员工和德国本地中方员工的待遇: 华为外派常驻员工的薪酬体系和德国本地中方员工是完全不一样的,华为外派常驻员工有 离家补贴,住房补贴,伙食补贴,通信报销,交通报销,有很多的奖金,有分红。 而德国本地员工是年薪制,奖金最多1个月。但是本地员工严格按照德国法律,享有保险,养老,休假等权利。 1) 薪酬:外派常驻员工的薪酬参考我上面的回复,14级实际到手37万左右转载 2014-11-15 18:04:24 · 5917 阅读 · 0 评论 -
Input/Output with files
C++ provides the following classes to perform output and input of characters to/from files:ofstream: Stream class to write on filesifstream: Stream class to read from filesfstream: Stream clas转载 2013-11-08 13:32:45 · 1047 阅读 · 0 评论 -
C++继承(public/protected/private)
继承谈到继承就不能不先说说public,protected,private:(1) Public成员:1. 在类内部:可直接使用,可以通过(类的对象,指针,引用-----------以后称之为类的形象代言人)访问。2. 类外部:可以通过类的形象代言人访问。(2) Protected成员:1. 在类内部:直接使用+形象代言人访问。2.原创 2013-11-07 13:51:23 · 1410 阅读 · 0 评论 -
私有继承的作用
私有继承的作用 2010-05-29 15:46:20| 分类:问题 |字号 订阅私有继承的第一个规则:和公有继承相反,如果两个类之间的继承关系为私有,编译器一般不会将派生类对象转换成基类对象。第二个规则: 从私有基类继承而来的成员都成为了派生类的私有成员,即使它们在基类中是保护或公有成员。私有继承的含义:私有继承意味着 "用...来转载 2013-11-07 13:47:03 · 1877 阅读 · 0 评论 -
<<通用的输入输出---------cout的扩展>> 引出的问题 ——扩展库函数功能
>这篇文章引出了一个问题: 一个库函数需要用到一个cout>的数据,但是标准库没有实现,我们可以尝试自己重载。但是如何让库函数找到我们重载的操作符呢? 这是个问题,在C++中,我们知道:一切名字在使用之前必须先声明之。而include是简单抄写代码,也就是说我们重载的函数会出现在库函数之后,这按常理是无法实现我们陈述的问题。当然我们可以简单的在incl原创 2013-09-05 17:30:49 · 788 阅读 · 0 评论 -
类作用域与命名空间续-----留有后续疑问
类作用域与命名空间续(名字查找规则) 在版本4中,有关于类作用域中的名字查找有这么一段话: 迄今为止,在我们所编写的程序中,名字查找(寻找与给定的名字相匹配的声明的过程)是相对直接的。(1) 首先,在使用该名字的块中查找名字声明,只需考虑在该项使用之前声明的名字。(2) 如果找不到该名字,则在包围的作用域(外层作用域,也需要在使用之前)中查找。(3)原创 2013-09-09 16:54:15 · 762 阅读 · 0 评论 -
C++编译器与链接器工作原理
C++编译器与链接器工作原理第一节:基本原理[2] 这里并没不是讨论大学课程中所学的《编译原理》,只是写一些我自己对C++编译器及链接器的工作原理的理解和看法吧,以我的水平,还达不到讲解编译原理(这个很复杂,大学时几乎没学明白)。要明白的几个概念:1、编译:编译器对源文件进行编译,就是把源文件中的文本形式存在的源代码翻译成机器语言形式的目标文件的过程,在这个过程中,编译器会转载 2013-09-04 17:19:08 · 876 阅读 · 0 评论 -
类与命名空间
类与命名空间>12.1.4中讲到: 在一个给定的源文件中,一个类只能被定义一次。如果在多个文件中定义一个类,那么每个文件中的定义必须是完全相同的。解析:定义一个类,指的是定义同一个类。如果名字相同,实现不同,那属于不同的类。由此我们容易想到以下问题:(1) 此处类的定义指什么?若是普通变量的定义,那是不可以在多个文件中同时定义的,只能在一处定义,多处声明,否则会原创 2013-09-02 16:31:01 · 2343 阅读 · 0 评论 -
C++ 内存管理的小问题--------危险的C++
C++ 内存管理的小问题--------危险的C++ 今天看>十三章的智能指针部分,了解到通过引用计数可以解决悬垂指针问题,这个方案解决的是多个指针指向同一对象时何时真正释放空间的问题。但是貌似还有其他悬垂的情况。那就是指向的的是栈空间的情况。情况一:#includeusing std::cout;using std::en原创 2013-09-14 10:37:39 · 855 阅读 · 2 评论 -
浅谈malloc-free and new-delete
浅谈malloc-free and new-delete 对于每一个C++程序员来说,malloc/free和new/delete并不陌生,但是又有多少人能够真正理解了呢,我一直就不大理解,直到写这篇博文我仍然处于一知半解的状况,但总算解决了一些疑问。所以仅以此文记录下来,以解后来者之惑,同时供以后自己参考学习之用,水平有限,欢迎拍砖。 一. 问题提出(1) m原创 2013-09-14 12:26:36 · 1263 阅读 · 0 评论 -
类作用域与命名空间续-----留有后续疑问
迄今为止,在我们所编写的程序中,名字查找(寻找与给定的名字相匹配的声明的过程)是相对直接的。(1) 首先,在使用该名字的块中查找名字声明,只需考虑在该项使用之前声明的名字。(2) 如果找不到该名字,则在包围的作用域(外层作用域,也需要在使用之前)中查找。(3) C++中所有名字必须在使用之前声明。(4) 在名字查找期间,如果类作用域使用的名字不能确定为成员名,则在包含该类或者成员定义的作用域中查找,以便找到该名字声明。原创 2013-10-07 10:39:21 · 980 阅读 · 0 评论 -
学习C++:实践者的方法
为什么要学习(并使用)C++ 显然,如果找不出要学习C++的理由,那么谈什么“正确的学习方法”等于是废话。 首先重复一句Bjarne的话:“我们的系统已经是极度复杂的了,为了避开C++的复杂性而干脆不用C++(Linus的做法),无异于因噎废食。”在所有可用C和C++的领域,C++都是比C更好的语言。当我说“更好的”时候,我说的是C++拥有比C更安全的类型检查、更好的抽象机制、更优秀的库。转载 2013-10-07 16:56:50 · 728 阅读 · 0 评论 -
函数重载与模板
提到函数重载想必大家都非常清楚,但是大家是否了解所有细节呢,经过这段时间阅读<<C++Primer>>我发现其实我一直以来并未完全理解重载机制,此处做一个小小的总结: (1)首先函数重载是指对函数名的重载,它只在同一作用域中有效,不同作用域中的名字不可构成重载,除非显示使用using关键字将名字引入该作用域。如例所示:void show(){ cout<<"outer"<<endl;}namespace in{using ::show;void show(int)原创 2013-10-07 15:34:39 · 1015 阅读 · 0 评论 -
转换与类类型
转换与类类型 今天看到>第14章9小节的转换与类类型,给我的感触是:类类型转换确实强大,但是却极易出错,很容易产生难以察觉的二义性,如非功力深厚,切记慎之。 此文不打算讨论类类型转换问题,因为本人实在没怎么掌握,仅以此记住该书有此一难点,希望以后有幸深入探讨。 虽然不讨论过于复杂的类类型转换的二义性问题及规避方法,但还是把手中的忠告罗列一下:原创 2013-09-25 14:33:37 · 1046 阅读 · 2 评论 -
C++实现Python变量续
C++实现Python变量续 想问题总是不够全面,一觉醒来突然发现昨天的实现语义不明朗,有点小问题,本来是想实现值语义的,就像a=100,b = a,b = 101.那么b是不会影响a的值得,如果影响了,那就是指针语义了。昨天的设计就是指针语义。 在C/C++中我们一个变量一般会跟固定的内存邦定,在运行期是不会改变的,只有指针会改变。那么我们会认为指针指向的是不原创 2013-11-15 20:03:16 · 1372 阅读 · 0 评论 -
C++实现Python变量
C++实现Python变量 仔细想想,其实所有分配在栈和静态存储区的存储空间都是由一个变量来标识,这是由系统自己管理的内存空间,而堆上分配的空间在每次运行期都是不一样的,也就是不是编译期决定的,所以只能用指针来标识。那么我们是否可以将这种指针标识的内存空间标量化,对象化呢?其实是可以的,事实上python就是这么做的。通过采用引用计数的方式来管理这段内存。我们现在要来实现这样原创 2013-11-14 22:31:32 · 1628 阅读 · 0 评论 -
内存管理与智能指针
内存管理与智能指针 作为一名合格的C++程序猿,管理内存是不可逃避的现实。像java,python等这些面向对象的语言来说,它们有垃圾回收机制,不需要程序员来管理内存。然而为了追求效率的C++没有实现这一机制。那么我们就必须借助各种技术来解决内存泄露这一头疼的事情了。 C++中内存泄露是防不胜防的,因为毕竟人的能力是有限的。那么我们就必须借助一些技术来减少原创 2013-11-14 23:01:21 · 1296 阅读 · 0 评论 -
虚继承及无关
虚继承class A{public:int a}class B:public virtual A{ public: Int b;}class C:public virtual A{ public: Int c;}原创 2013-11-06 17:21:00 · 850 阅读 · 0 评论 -
Volatile关键词深度剖析(深度好文,惊呆了)(何登成的技术博客)
C/C++ Volatile关键词深度剖析十二 2nd, 2013发表评论 | Trackback1 背景 12 Volatile:易变的 12.1 小结 23 Volatile:不可优化的 33.1 小结 44 Volatile:顺序性转载 2015-11-27 19:43:29 · 1550 阅读 · 0 评论