C/C++小知识
thefutureisour
ZTE基带部码农,平时工作很忙,不再更新opencv相关内容,也不解答大家问题了。
展开
-
模板的全特化与偏特化
模板为什么要特化,因为编译器认为,对于特定的类型,如果你能对某一功能更好的实现,那么就该听你的。模板分为类模板与函数模板,特化分为全特化与偏特化。全特化就是限定死模板实现的具体类型,偏特化就是如果这个模板有多个类型,那么只限定其中的一部分。先看类模板:templateclass Test{public: Test(T1 i,T2 j):a(i),b(j){cout<<"模板类"原创 2012-09-10 21:37:16 · 47401 阅读 · 8 评论 -
关于malloc/free与new/delete的区别
1.malloc/free是函数,C语言本身是不支持重载的。而new/delete是操作符。但是我们可以尝试重载它们:void* operator new(std::size_t) throw (std::bad_alloc){ cout<<"重载版本,只抛出异常"<<endl; throw bad_alloc();}void operator delete(void* p) thr原创 2012-10-23 14:56:27 · 1248 阅读 · 0 评论 -
数据存储类型:auto、static、register、extern
C语言中的每个变量有两个属性:数据类型(整形、浮点型、字符型),还有数据存储类别,分别为自动的(auto),静态的(static),寄存器的(register)和外部的(extern)。下面对它们进行逐一说明:auto类型:其实在函数中的局部变量,不加特殊声明,都是auto变量,但是关键字"auto"可以被省略。这些变量在函数被表用时分配存储方式,函数调用结束后这些存储空间就被释放了。原创 2012-11-04 20:11:04 · 8623 阅读 · 0 评论 -
unsigned int与int相加的问题
以前还真没在上面较过真,结果今天就被鄙视了,特地记下来。先看程序:int main(){ int a = -6; unsigned int b = 4; if(a+b > 0) printf("a+b>0\n");//这句话被打印 else printf("a+b<0\n"); int z = a+b; if(z > 0) printf("z>0"); else原创 2012-11-05 08:19:46 · 18803 阅读 · 8 评论 -
当指针并没有指向实际的对象时,能否调用对象的成员函数
先看程序吧:(这也是我遇见的笔试题)#include using namespace std;class Test1{public: void func() { cout<<"Test1"<<endl; }};class Test2{public: Test2(int i = 0):val(i){} void func() { cout<<val<<en原创 2012-11-09 09:47:45 · 2421 阅读 · 0 评论 -
关于浮点数在计算机中的储存
float f = 1.3f;那么它是如何储存在32计算机中的呢?我们知道一个float占4个字节,也就是32位。且intel处理器是小端的。低位在高字节,高位在低字节。为了讨论方便,我们先求出1.3对应的浮点数的32bit的表示,然后再调换字节的顺序。首先,将1.3转化为2进制:整数位就是正常求法,对于小数位,则是*2,如果大于1为1,小于1为0:1.0100110011001100原创 2012-11-14 22:37:31 · 1613 阅读 · 0 评论 -
如何判断字节序
字节序有两种:小端字节序:低字节在低地址中,高字节在高地址中。这种字节序又称为主机字节序,intel的cpu使用的就是这种字节序。大端字节序:低字节在高地址中,高字节在低地址中。这种字节序又称为网络字节序,socket传输时就需要使用这种字节序。假设我们的32位整数0x12345678是从起始位置为0x00的地址开始存放,则: //0x00 0x01 0x02 0x03转载 2012-11-15 09:39:08 · 4927 阅读 · 1 评论 -
使用容器时一定要保证容器中的对象是可以复制、独立析构的
使用容器时一定要保证容器中的对象是可以复制、独立析构的。下面通过一个简单的例子来说明:class A{public: A(int i = 0):ival(i){} int ival;};class B{public: double dval; A* pa; B():dval() { pa = new A; } ~B() { delete pa; }原创 2012-12-10 09:37:26 · 1225 阅读 · 0 评论 -
柔性数组
它的基本思想其实可以从一个简单的问题扩展开来,一个空的结构体(类),它的size是多少?稍微有点编程经验的人都会说是1,因为虽然他没有实际的内容,这个1起到了占位的作用。下面我们要面对这么一个问题,对于一个结构体,它有一个数组成员,但是数组的大小却不确定,那么应该怎么设计这个结构体呢?我们先给出一个测试代码:struct Test{ int size;// int arr[];//两原创 2012-12-14 09:52:48 · 1328 阅读 · 0 评论 -
关于基类与派生类之间对象、指针等转化关系的小结
先上一段代码:#include using namespace std;//没有使用虚函数的继承派生关系class Base{public: Base(int i = 0):ival(i){} void getVal() { cout<<ival<<endl; }private: int ival;};class Derived:public Base{原创 2012-10-29 10:44:16 · 6963 阅读 · 1 评论 -
利用C++标注库实现文件的读写
直接上程序:#include #include #include using namespace std;int main(){ ofstream ofs("1.txt"); string str = "hello,world!"; int len = str.length(); ofs.write(str.c_str(),len); ofs.close(); ifs原创 2012-10-31 20:50:07 · 1286 阅读 · 0 评论 -
C语言中对文件操作的小结
在C语言中,文件的操作是通过FILE结构体进行了,具体实现时,先利用fopen返回一个指向FILE结构体的指针:FILE *fopen( const char *filename, const char *mode );filename:文件名,mode:打开的模式,规定了是可读、可写、追加之类的属性。"r":可读,如果文件不存在,fopen调用失败"w":可写,如果文件存在,那么原创 2012-10-31 20:17:00 · 17861 阅读 · 2 评论 -
总结笔试题中的类、结构体的sizeof问题
1.空类的大小是1.class Empty{};int main(){ cout<<sizeof(Empty)<<endl;}一个空类的大小是1,而不是0.这是为什么呢,因为如果你定义了这个类的对象,那么你得有它的内存地址才行,而如果它的大小为0,它就不占内存地址了,所以,编译器将它的大小设为了1.2.静态成员不计入类的大小中class Empty{pu原创 2012-10-17 14:24:20 · 1232 阅读 · 2 评论 -
如何创建一个不能被继承的类
在JAVA中,有final关键字;在C#中,有sealed关键字表明这个类不能被继承。但是C++中没有这个关键字,所以想达到这样的目的还是得费点功夫。先看程序吧:class Uninheritable { friend Base;private: Uninheritable(){}};class Base:public Uninheritable{};class原创 2012-09-11 15:05:09 · 2029 阅读 · 0 评论 -
STL库中size_type的问题
int main(){ vector array1; array1.push_back( 1 ); array1.push_back( 2 ); array1.push_back( 3 ); for( vector::size_type i=array1.size()-1; i>=0; --i ) { cout << array1[i] << endl; } re原创 2012-09-28 15:30:30 · 2073 阅读 · 0 评论 -
C++中main函数的悲哀
这个得从面向过程的C语言开始。为什么说C语言一定要有main函数呢?C语言中有数据和函数。函数部分放在代码区,数据分为两类:局部的和全局的,它们的区别在于放在静态数据区还是堆栈中。而且全局变量和静态变量是在函数执行前就创建好的。C语言又有一个规定:全局区不能有可执行代码 ,可执行代码必须进入函数中。但是C语言中的函数都是全局的,这就导致函数不能嵌套定义:嵌套定义导致函数内部定义的函数成原创 2012-06-04 09:10:11 · 5670 阅读 · 0 评论 -
C++为什么不叫++C
大家都知道自增操作符有“前置”和”后置“两种:比如:int a = 0;如果你使用++i,那么你将直接得到i的下一个值,而得不到i的初值;当你使用i++时,你能使用的,却是i的初值,使用完以后i才自增。让我们再看C++与C语言的关系:C++是在C语言的基础上发展起来的,保留了C语言大部分特性的基础上,增加了面向对象的程序设计的内容。是先有了C语言,才有C++的,而且C++兼容了C语言的内容,这原创 2012-06-17 16:21:04 · 1019 阅读 · 0 评论 -
C++中的变量内存分配方式
C++中的变量可能分配在5个地方中的一个:栈、堆、自由存储区、全局/静态存储区、常量存储区。其中,局部变量,函数的形参是分配在栈中的。这段内存由编译器自动分配、释放。new和delete用来申请的释放堆上的内存。malloc和free用来释放自由存储区上的内存。全局变量\static都分配在全局/静态存储区中。常量则分配在常量存储区中。在windows下,栈是向低地转载 2012-09-05 15:12:18 · 1052 阅读 · 0 评论 -
关于scanf被跳过的问题
今天遇见一个特别神奇的问题:int main(){ char a,b; printf("please input a: "); scanf("%c",&a); printf("please input b: "); scanf("%c",&b); return 0;}为什么这个函数的第二次scanf被跳过了?其实并没有被跳过,而是你第一次输入了a 回车以后,把回车的值赋转载 2012-09-17 21:36:59 · 3311 阅读 · 4 评论 -
为什么默认实参总是放在函数声明中
对于函数的默认实参,我们一般都是放在函数的声明中的,而在定义中并不指定默认实参:在头文件中声明函数://test.hvoid func(int i = 0);而在对应的源文件中实现函数://test.cppvoid func(int i){}//什么也不做如果我们将默认实参从声明中删除,而在定义中添加,或者是声明和定义中都添加,不论值是否相同,都会报错。但是,c++原创 2012-10-12 13:05:24 · 3844 阅读 · 0 评论 -
如何通过迭代器来或得对应元素的下标
首先介绍一个函数:distance,它返回的是两个迭代器之间的距离。使用这个函数,就能完成迭代器与下标之间的转换:下标 = 当前迭代器位置-容器头部。看一个例子就明白了:#include #include using namespace std;int main () { list mylist; for (int i=0; i<10; i++) mylist.push原创 2012-06-11 17:15:35 · 5533 阅读 · 0 评论 -
socket通信如何处理每次包长度不定问题
说起来,这是一个漫长的问题:客户端和服务器通信的结构是:包头+数据长度+数据客户端请求服务器发送200包数据。包头=request;长度=4(一个int),数据=200;服务器在收到客户端的请求后,在while循环里面不停的send,直到够200包:包头=indicate 长度=XX,后面跟一大串数据;发完以后,再发一个结束的包:包头=end,长度-1,data=无效值。在服务器端原创 2014-02-07 16:57:04 · 7504 阅读 · 0 评论