
语法函数
wyjvip333
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
剖析浮点数
[转载][url]http://blog.youkuaiyun.com/masefee/archive/2010/01/30/5272554.aspx[/url] 这里历史和发展就不说了,直接从IEEE浮点标准说起。 在 IEEE 标准中,浮点数是将特定长度的连续字节的所有二进制位分割为特定宽度的[b]符号域,指数域和尾数域[/b]三个域,其中保存的值分别用于表示给定二进制浮点数中的符...原创 2010-12-10 10:39:34 · 185 阅读 · 0 评论 -
实现:不能被继承的类
1,首先想到的是在C++ 中,子类的构造函数会自动调用父类的构造函数。同样,子类的析构函数也会自动调用父类的析构函数。要想一个类不能被继承,我们只要把它的构造函数和析构函数都定义为私有函数。那么当一个类试图从它那继承的时候,必然会由于试图调用构造函数、析构函数而导致编译错误。2,可是这个类的构造函数和析构函数都是私有函数了,我们怎样才能得到该类的实例呢?我们可以通过定义静态来创建和释放...原创 2010-08-31 17:35:12 · 112 阅读 · 0 评论 -
句柄的使用实例
1,这个实例采用了使用计数策略.2,实例代码:[code="cpp"]#include #include #include #include #include #include #include #include using namespace std;class Item_base{friend istream& operator>...原创 2010-06-02 11:24:35 · 348 阅读 · 0 评论 -
关于类的一些语法:
所谓"书越读越薄",这话说得真是有道理.最近频繁面试,不得已重温了下primer.1,C++语言设计的主要目标:允许程序员定义自己的类,它们用起来和内置类型一样容易直观.2,在普通的非const成员函数中,this的类型是T * const,即:this本身不能改变.3,如果返回类型使用类定义的类型,则必须使用完全限定名.例如:class Screen{...原创 2010-06-02 09:26:00 · 120 阅读 · 0 评论 -
sizeof(string对象)的大小
1,无语了,string对象的大小固定就是4啊.2,实例代码:[code="cpp"]#include using namespace std;void func(const string& t){ cout原创 2010-06-01 11:32:28 · 314 阅读 · 1 评论 -
C语言中的不定参数
1,最近刚刚知道C语言还有不定参数这么个东东。2,解决方法:三个宏的使用va_arg()、va_start()和va_end()上述的宏原型如下所示:[code="C"] type va_arg(va_list argptr, type);void va_end(va_list argptr);void va_start(va_list argptr, last_...原创 2010-12-15 12:28:26 · 283 阅读 · 0 评论 -
C语言中不同增值语句的区别
1,mango[i++]+=y;被当作mango[i]=mango[i]+y; i++;pear[++j]+=y;被当作++j;mango[j]=mango[j]+y;2,++x:表示取x的地址,增加它的内容,然后把值放到寄存器中。x++:表示取x的地址,把它的值装入寄存器,然后增加它的内容。3,建议:不要在一行代码里实现太多的功能。melon[ -...原创 2010-05-12 12:50:54 · 160 阅读 · 0 评论 -
提升为N的倍数(N为2的指数次)
1,可以这么做:int num=15;num = (num + (N-1)) & (~(N-1))原创 2010-07-18 10:16:26 · 109 阅读 · 0 评论 -
C++ 中:new的用法
先放这儿,有时间了,在作详细整理.C++ new用法的正确方法应该如何操作? 在这篇文章中我们将会根据其两种不同的含义分别介绍一下它的影音方法, 希望能给大家带来一些帮助。 C++ 编程语言中有一 种叫做new的术语。不过这一概念是比较模糊的,有些人把它理解为new函 数,但是有的人又会把它理解为new运算符。那...原创 2010-07-17 16:26:35 · 160 阅读 · 0 评论 -
尽量不要在一个表达式中有多个副作用
1,一般来说,编c/c++程序有一个纪律:一个语句中不要有两个表达式有副作用。典型的这类行为包括:b=(a++)+(a++)+(a++);这是典型的违反这条纪律的行为。每个a++都有副作用(改变a的值)。整个表达式的值跟求值顺序直接相连。2,一个实例代码:[code="cpp"]#include using namespace std;int fun(int i)...2010-05-02 10:48:43 · 222 阅读 · 0 评论 -
大小端对应字节, 注意和一个字节内位序的区分
1,一个例子:[code="c++"]#include union{ struct s { unsigned X1:2; //8bit的低2位 unsigned X2:3; unsigned X3:3; //8bit的高3位 }S; char c;}X;// 01...原创 2010-09-09 10:11:08 · 381 阅读 · 0 评论 -
为什么构造函数,不能是virtual?
1,C++语言是静态语言,而把构造函数写成虚函数意味这可以动态构造。这是和C++静态语言特性相矛盾的,所以就C++语言本身来说,是不允许的。 2,虚函数是为了迟绑定吧,为什么要迟绑定?因为好多行为编译期确定不了,需要运行期确定并调用合适的函数去完成相应的功能。但是对象构造的行为是确定的,不管是不是多态,只要有new Object()这种动作,就一定会沿着继承的顺序依次执行对象的...原创 2010-09-25 15:24:21 · 634 阅读 · 0 评论 -
存在虚基类时,类对象的大小
1,实例代码:[code="c++"]#include using namespace std;class Top{protected: int x;public: Top(int n) { x = n; } virtual ~Top() {}};class Left : virtu...原创 2010-12-09 19:38:11 · 177 阅读 · 0 评论 -
关于父类的构造的顺序
1,没有虚基类的情况:[code="c++"]#include #include using namespace std;class A{public: A() { cout原创 2010-12-09 19:33:45 · 163 阅读 · 0 评论 -
关于empty class的大小
1,首先简要说明下为什么empty class的大小不是0?这是因为c++标准有个规定,操作符new object必须返回一个唯一的指针指向一个对象,如果empty大小为0,无疑底层的操作将是malloc(0)等等之类,则返回NULL或出错,因此设定其为1。实际应用中,如果一个empty作为一个子类的基类或虚基类,编译器都会作一些特殊处理,去掉这个额外的1。[code="c++"]...原创 2010-12-09 19:32:23 · 192 阅读 · 0 评论 -
JVM实现机制及内部基本概念
兴趣所致,搜了一些关于JVM的简单介绍,算是扫盲吧。1.JVM实现机制Java虚拟机就是一个小的计算机,有自己的指令集,有自己的文件系统,管理内部的表和数据,负责读取class文件里面字节码,然后转换成不同操作系统的CPU指令,从而使得Java程序在不同的操作统上顺利的跑起来。所以Window的JVM能把字节码转换成Window系统的指令集,Linux的JVM能把字节码转换成Lin...原创 2010-12-09 19:27:57 · 124 阅读 · 0 评论 -
指向对象成员变量的指针。
1,工作定了后,把《Inside the C++ object model》又重新看了一遍,之前不太理解的差不多都看明白了,有空好好总结下发上来。这个算是其中的一个点吧,之前根本没留意,所以特意写一篇记录下。[code="c++"]#include using namespace std;class A{public: A (int m = 0, int ...原创 2010-12-09 19:18:39 · 150 阅读 · 0 评论 -
面向对象的一些常见问题总结。
1,构造函数中调用虚函数的问题。注:一般编译器都会在执行完base subject的构造函数和调用用户代码之前,实施当前对象vptr的初始化工作。因此,如果当前对象内定义了某函数,构造函数中调用的一定是当前对象内的,virtual可以认为不存在。实例代码:[code="c++"]#include using namespace std;class Base...原创 2010-12-09 19:08:47 · 227 阅读 · 0 评论 -
关于C++的名字查找规则
1,总结一句话:由内向外,找到合适的即刻停止。实例代码:[code="c++"]#include using namespace std;class A{public: virtual ~A() {} virtual void f() { cout ...原创 2010-12-09 19:05:56 · 233 阅读 · 0 评论 -
继承下的名字查找规则,最近作用域
1,[code="C++"]#include using namespace std;class A{public: virtual ~A() {} virtual void f() { cout原创 2010-11-06 20:04:08 · 130 阅读 · 0 评论 -
虚基类和多重继承总结
1,虚基类,其构造函数总是在最后一个层次最先并且真正被执行。实例代码:[code="c++"]#include using namespace std;class A{public: A(const string& s) { cout ...原创 2010-11-06 19:54:27 · 162 阅读 · 0 评论 -
什么是非平凡(nontrivial)的析构函数?
class Test{ int* p;}这时析构函数就不能是trivial的,因为它必须把p申请的内存释放掉!而如果class Test{ int p;}析构函数可以什么也不做,就是trivial的。nontrivial需要你自己负责处理的一些问题,诸如内存的释放。因为编译器产生的析构函数只是满足编译器的需要,而不是程序的需要。所以对...原创 2010-01-29 10:29:38 · 1650 阅读 · 0 评论 -
释放对象数组:delete与delete[]
练习 14.11 中提到:Account *parray=new Account[100];delete parray;delete [] parray;方括号的存在会使编译器获取数组大小(size)然后析构函数再被依次应用在每个元素上,一共size次。否则,只有一个元素被析构。无论哪种情况,分配的全部空间被返还给自由存储区。我的问题是:为什...原创 2010-01-29 10:12:52 · 1333 阅读 · 1 评论 -
static_cast与reinterpret_cast
static_cast 和 reinterpret_cast 操作符修改了操作数类型。它们不是互逆的.static_cast在功能上基本上与C风格的类型转换一样强大,含义也一样。它也有功能上限制。例如,你不能用static_cast象用C风格的类型转换一样把struct转换成int类型或者把double类型转换成指针类型. reinterpret_cast是为了映射到一个完全不同类型的意...原创 2010-01-20 15:41:15 · 89 阅读 · 0 评论 -
char *p="abc" 与 char p[]="abc" 的区别
1.以字符串形式出现的,编译器都会为该字符串自动添加一个0作为结束符,如在代码中写"abc",那么编译器帮你存储的是"abc\0" 2."abc"是常量吗?答案:有时是,有时不是不是常量的情况:"abc"作为字符数组初始值的时候就不是,如 char str[] = "abc";因为定义的是一个字符数组,所以就相当于定义了一些空间来存放"abc",原创 2010-01-08 10:41:01 · 395 阅读 · 0 评论 -
程序运行闪一下就没了,看不到运行结果
程序头添加#include ,程序结束处添加system("PAUSE");或者用命令行运行同一个变量在一个表达式中两次作为左值出现,其结果是不确定的.如:(i++)+(i++);i=i++...原创 2010-01-08 10:24:01 · 668 阅读 · 0 评论 -
do{...}while(0)用途
这是一个奇怪的循环,它根本就只会运行一次,为什么不去掉外面的do{..}while结构呢?我曾一度在心里把它叫做“怪圈“。原来这也是非常巧妙的技巧。在工程中可能经常会引起麻烦,而上面的定义能够保证这些麻烦不会出现。下面是解释: 假设有这样一个宏定义#define macro(condition) \if(condition) dosomething() 现在在程序中这...原创 2010-01-08 10:19:42 · 102 阅读 · 0 评论 -
malloc()和calloc()有啥区别
函数malloc()和calloc()都可以用来动态分配内存空间,但两者稍有区别。1,malloc()函数有一个参数,即要分配的内存空间的大小.void *malloc(size_t size);2,calloc()函数有两个参数,分别为元素的数目和每个元素的大小,这两个参数的乘积就是要分配的内存空间的大小.void *calloc(size_t numElements,s...2010-01-04 17:35:48 · 154 阅读 · 0 评论 -
关于类型转换的问题
先看一段代码:[code="c++"]#include int main(){ char c1=100; char c2=200; char c3=c1+c2; printf("c2==%d\n",c2); printf("c3==%d\n",c3); char x=124; char y=x+x; ...原创 2009-12-26 18:42:30 · 121 阅读 · 0 评论 -
sscanf函数和正则表达式
此文所有的实验都是基于下面的程序:char str[10];for (int i = 0; i < 10; i++) str[i] = '!';执行完后str的值为str = "!!!!!!!!!!"我们把str的每个字符都初始化为惊叹号,当str的值发生变化时,使用printf打印str的值,对比先前的惊叹号,这样就可以方便的观察str发生了怎样的变化。下...原创 2009-12-25 10:22:24 · 525 阅读 · 0 评论 -
记事本
#include #include #include #include using namespace std;class MyAdd : public binary_function{public: MyAdd(){} int operator()(int m,int n) { return m+n; }...2009-12-23 23:41:57 · 103 阅读 · 0 评论 -
关于宏定义,常见宏及其对应的头文件
(1)#ifndef和 #define组合一般用于头文件中,防止该头文件被重复引用.其用法一般为:#ifndef #define ......... // include or define sth.#else ......#endif在理论上来说可以是自由命名的,但每个头文件的这个“标识”都应该是唯一的。标识的命名规则一般是头文件名全大写,前...2009-12-21 11:09:38 · 512 阅读 · 0 评论 -
匈牙利命名法
1,基本原则:变量名=属性+类型+对象描述.关于属性:(1)全局变量:g_(2)常量:c_(3)类成员变量:m_(4)静态变量:s_关于类型:(1)指针:p(2)函数:fn(3)无效:v(4)句柄:h(5)长整型:l(6)布尔:b(7)浮点型(有时也指文件):f(8)双字:dw(9)字符串:sz(10)短整型:n(11)双...原创 2009-12-21 10:54:31 · 96 阅读 · 0 评论 -
数组名是地址么?它和地址的差异在哪里呢?
如果运算需要的话,所有的数组都存在到它元素的指针类型的右值的隐式类型转换。说数组是本身就是地址是不科学的,而应该说数组能够自动的转化为指向他的元素的指针,这种转化是单向的,是一种退化,损失了原来数组的大小这个重要的信息。除了 sizeof 之外,其他运算符作用到数组上的时候,都要发生这种转化,即使取下标也不例外。比如整型二维数组w[3][4],先不要把 w 看作地址。把 w 看作三个四...原创 2010-01-08 11:01:39 · 1608 阅读 · 0 评论 -
数组和指针的区别
假设a是数组,p是指针。比如 char a[5]; char *p;数组和指针是完全不同的类型,当然有区别1.数组有点像label,本身不占空间,占空间的是数组元素。指针本身占空间,大小为sizeof(T*),当然指向的内容也占空间。2.a 和 &a 类型不同,但是“地址”相同,都是label标记的地址3.sizeof(a) 等于数组元素的大小 乘以 元素的个数...原创 2010-01-08 11:18:34 · 90 阅读 · 0 评论 -
C-Style类型转换引发的问题
转载自[url]http://jackaldire.com/201001/c-style-cast-issues/[/url]有人在byr论坛C++版上问了这样一道C++面试题:[code="cpp"]#include using namespace std;class A { public: void fun() { }};cla...原创 2010-01-20 11:46:26 · 492 阅读 · 0 评论 -
volatile关键字
1,volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。 注:“易变”是因为外在因素引起的,象多线程,中断等,并不是因为用volatile修饰了的变量就是“易变”了,假如没有外因,即使用volatile定义,它也不会变...原创 2010-01-19 16:42:46 · 89 阅读 · 0 评论 -
定义、声明、初始化、赋值
声明:就是告诉编译器,这个变量名是有定义的(不一定在这里定义,但编译器应该能找到义)定义:给一个变量分配空间的地方,根据规定,在整个编译过程里,每个变量有且仅能有一个定义(只有极少数例外)初始化:在变(常)量被定义的同时,在被分配的空间里,放入的值,这个概念对常量比较明显,因为常量只能被初始化。赋值:在变(常)量的空间被分配好了以后,再修改该空间内容的操作。...2010-04-07 21:59:05 · 98 阅读 · 0 评论 -
内存分配方式以及它们的区别
1,从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static 变量。2,在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集。3,从堆上分配,亦称动态内存分配。程序在运行的时候用malloc 或new 申请任意多少的内存,程序员自己...2010-04-07 21:04:37 · 347 阅读 · 0 评论 -
只能用intialization list 而不能用assignment
当类中含有const或reference 成员变量原因:1,构造函数的 {} 内的操作只能是赋值.调用构造函数的时候,首先是给该实例(类的具体对象)分配空间.使用初始化列表的话,就在分配空间的时候,同时将其空间初始化.执行到构造函数的大括号里的时候,所有成员的空间都已经分配好了,无论是否已经被初始化过,对其调用的“=”只能是赋值,2,初始化与赋值是不同的:(1)对象的初...2010-04-07 21:02:20 · 144 阅读 · 0 评论