首页
社区
课程
招聘
[原创]c++的一些微妙的细节(不断更新中)
发表于: 2011-5-16 12:26 6211

[原创]c++的一些微妙的细节(不断更新中)

2011-5-16 12:26
6211
1、在for和while等循环语句中{}两者之间定义的变量,作用域只在大括号之间,虽然反汇编后看到的内存位置不变,但是要正确理解其含义,即每一次循环后该变量的作用域和生命期结束,该变量释放消失,下一次开始循环该变量重新建立获得生命期,就像函数中定义的局部变量一样,而不是该变量再循环过程中不变。
2、如下代码是错误的float f=0.1;(int)f=9;为何呢?因为强制转换后的变量存在于以临时存储区域,该区域至刻度不可写。
3、声明和定义不完全是一回事,定义用于分配存储空间,在一个程序中一个变量只可以有一个定义。声明是向程序表明类型和名字,定义也是声明。可通过关键字extern只声明而不定义当声明为定义时才可有初始化式。
4、declspec(dllinport/dllexport)与c还是c++有关而处理方式不同。在c文件中,只要导出的与导入的名字一样就能完成连接,与类型无关。但在c++中,不仅与名字有关,而且与类型名称也有关,观察得知类型名与名字同时参与了名字改编。尤其要注意结构体,这意味着,导入与导出的结构体类型名字也要一样,但是用typedef和define重定义过后的不一样不要紧,也就是说原始类型名要一样。
5、数组的首元素值指针值与指向数组的指针值一样但类型不一样,值一样是因为数组首元素地址也就是数组的起始地址,类型不一样很好理解了。
6、const int* p与int* const p不一样,前者是指向const对象的指针,后者是指针的值是常量。
7、函数名与函数指针的不同。两者实质上都是地址,但是函数名是指针常量即一个类型为指针的数,后真是一个指针变量。
8、指针常量与常量指针不同,从文字上即可看出,指针常量重在常量,常量指针重在指针。
9、赋值语句也有返回值。如if(int i=9),这样理解:i=9是一个语句,它完成了对i的赋值,但同时返回了一个9的值,该语句等于是if(9)。
10、switch() int i=9;case:  ;case:  ;default;这样的语句是错误的,因为int i=9永得不到执行,而把它放在case语句中C++也是不允许的。
11、函数参数的传递可以在这样理解,即形参为一个变量,进行如形参=实参的赋值,这样形参与实参的类型匹配就如普通的赋值一样了。
12、返回非引用类型实际上是把返回值初始化在调用函数处创建的临时对象,术语为temporary object。引用型的是直接返回返回对象。
13、作用域的查找规则如下,现在包含该变量的作用域中查找,找不到再在包围该作用域的作用域中查找。在类中更为典型。
如:int a;
class c{
int a;
void f();
};
void c::f()
{
int a;
a=0;
}
这样的话匹配的是f函数中的局部变量a,如果无这个局部变量,则匹配类中的成员变量a,两者皆无的话,则匹配全局变量a。
14、this指针的问题。众所周知,this指针隐含的出现在成员之前,不仅是成员变量,也有成员函数。

class c{
int a;
void f();
void x();
};
void c::f()
{
a=0;
x();
}实际上是this->a;this->x();一般书上只说对成员变量,但也应对成员函数。如果x为虚函数,则就必须有this指针进行调用才合适。
15、static成员在继承中不进行继承,即不管被继承几次,内存中只有一份static成员。
16、类类型之间的转换。两个类进行赋值,如果同类型的话,即直接复制。如果为父类=子类,则将子类中的父类部分赋给父类。如果为子类=父类或两个无任何继承关系的类,则需用强制转换,结果是将一个类的全部强制赋给另一个类,而不是部分赋值。(未完结,待续)

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
2
这个不应该发在软件安装编程版块
2011-5-16 13:10
0
雪    币: 693
活跃值: (108)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
不好意思,请斑竹帮忙移到合适的板块
2011-5-16 13:20
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
好东东,收藏学习!
2011-5-20 09:57
0
雪    币: 91
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
好东西 收藏
2011-5-20 10:54
0
雪    币: 123
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
随便看了两条

1.代码里如果在{}外操作之前{}内定义的变量,记得编译器不会让你过的吧?
2.不知道原来还有人会这样写..-0-...话说不是应该写成f = (float)9;这样的吗?

很久没用c++写过东西了,不知道记错没
2011-5-20 10:57
0
雪    币: 214
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
第一条不是很容易理解么,当然是在下一个生命周期重新赋值,第二条很有意思,第三条描述不清,我认为只要一句定义 = 声明 + 初始化就可以了,……这个帖子适合发到一些C++学习论坛,哈哈。
2011-5-20 13:59
0
雪    币: 245
活跃值: (93)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
8
第二条是你自己没弄清左值和右值的关系 换句话说 你看的代码太少
左值不可以强制类型转换 右值才可以 所以你的程序可以写成这样
        float f=1.0;
        f=(int)9;
虽然这个不是你想要的结果 可是你想要什么呢 想要取整f=1?这个涉及到浮点类型和整形在内存中存储的知识。如果你的浮点数是正数(负数只需要做个小小的转换)可以利用下面这个语句来取整
float f=12.3456;
int floor=((((*((int *)&f))&(0x007fffff)) | 0x00800000) >>(23-((((*((int*)&f))>>23) & 0xff)-127)));
2011-5-20 15:39
0
雪    币: 80
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
10、switch() int i=9;case:  ;case:  ;default;这样的语句是错误的,因为int i=9永得不到执行,而把它放在case语句中C++也是不允许的。
在case后面加一对括号{}就可以把 int i = 9;放进去。
2011-5-20 16:13
0
雪    币: 245
活跃值: (93)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
10
嗯 不知道兰州想表达什么意思 如果只是想转换f成int型使用 就在使用的地方(int)
如果想把9赋给f 就(float)9
如果想取整 就是int(f)
2011-5-20 16:32
0
雪    币: 203
活跃值: (214)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
这个是基础更加合适吧。
2011-5-27 19:35
0
游客
登录 | 注册 方可回帖
返回
//