随笔分类 - C++
摘要:1.extern的作用 extern有两个作用,第一个,当它与"C"一起连用时,如: extern "C" void fun(int a, int b); 则告诉编译器在编译fun这个函数名时按着C的规则去翻译相应的函数名而不是C++的, C++的规则在翻译这个函数名时会把fun这个名字变得面目全非,可能是fun@aBc_int_int#%$也可能是别的,这要看编译器的"脾气"了(不同的编译器采用的方法不一样),为什么这么做呢,因为C++支持函数的重载啊,在这里不去过多的论述这个问题,如果你有兴趣可以去网上搜索,相信你可以得到满意的解
阅读全文
摘要:类名:TSocket文件包含:TSocket.cpp、TSocket.h使用方法:1、在对话框头文件包含TSocket.h#include "TSocket.h"2、定义变量TSocket m_TSocket;3、TSocket类函数功能介绍:LoadSocket():加载SOCKET库CreateSocketSer(TRUE):创建SOCKET,TRUE为TCP,FALSE为UDPBingSocket():绑定IP和端口,有默认值Start(precvPar):precvPar为一个RECVPARAM结构体指针SendData(strSend):发送数据函数4、服务端处理
阅读全文
摘要:开始之前必须明确strlen的含义,原型为size_t strlen( char *str ); strlen返回字符串的长度,即null(\0)之前的字符的数量。一 char* 与 char []实例加注释:Code Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->void TestCharPointerAndArray() { char*c1 ="abc"; //abc\0常量区,c1在栈上, 常量区程序结束后自动释放
阅读全文
摘要:这两天仔细看了下TinyXml的源代码, 完美地搞清楚了一些网友和我自己的很多疑问. 鉴于TinyXml的实用性, 而且现在不少人在使用, 就决定在此做点有意义的事情 ---- 列出使用TinyXml库值得注意的几个地方.关于TinyXml库的介绍网上有很多资料, 大家可以试着搜下, 这里我就不多说了, TinyXml很小巧, 但它提供了非常丰富的接口, 特别适用于存取程序的数据, 如果你使用它, 相信你会感觉到它的灵活的. TinyXml下载地址:http://download.csdn.net/detail/hoyt00/3904805http://sourceforge.net/pro.
阅读全文
摘要:构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。例如:classCExample{public:inta;floatb;//构造函数初始化列表CExample():a(0),b(8.8){}//构造函数内部赋值CExample(){a=0;b=8.8;}};上面的例子中两个构造函数的结果是一样的。上面的构造函数(使用初始化列表的构造函数)显式的初始化类的成员;而没使用初始化列表的构造函数是对类的成员赋值,并没有进行显式的初始化。初始化和赋值对内置类型的成员没有什么大的区别,像上面的任一个构造函数都可以。对非内置类型成员变量,为了避免
阅读全文
摘要:什么是类型安全?类型安全很大程度上可以等价于内存安全,类型安全的代码不会试图访问自己没被授权的内存区域。“类型安全”常被用来形容编程语言,其根据在于该门编程语言是否提供保障类型安全的机制;有的时候也用“类型安全”形容某个程序,判别的标准在于该程序是否隐含类型错误。类型安全的编程语言与类型安全的程序之间,没有必然联系。好的程序员可以使用类型不那么安全的语言写出类型相当安全的程序,相反的,差一点儿的程序员可能使用类型相当安全的语言写出类型不太安全的程序。绝对类型安全的编程语言暂时还没有。C语言的类型安全C只在局部上下文中表现出类型安全,比如试图从一种结构体的指针转换成另一种结构体的指针时,编译器将
阅读全文
摘要:复制构造函数(copy constructor):单个对本类类型引用形参(常用const修饰)。当定义一个新对象并用同一个类型的对象对它进行初始化式,将显式使用复制构造函数,当该类型的对象传递给函数或从函数返回该类类型的对象时,将隐式调用复制构造函数。复制构造函数的形参可以不为const,但必须是一个引用。否则每当以pass-by-value传递参数时,调用一个复制构造函数都会导致无穷递归。如果不定义复制构造函数,编译器将合成一个,因此若要完全禁止复制(iostream类就不允许复制),禁止用户复制该类类型而且连友元和成员函数都不能进行复制:在private中声明但不定义一个复制构造函数。用户
阅读全文
摘要:C++中static类数据成员是指以下两种: 类static成员函数 和 类static数据成员一:使用类的static成员的优点 1:static成员的名字是在类的作用域中,因此可以避免与其他类的成员或者全局对象名字的冲突 2:可以实施封装。static成员可以是私有成员,而全局对象不可见 3:通过阅读程序容易看出来static成员与特定类关联的。二:static成员的定义 static成员遵循正常的共有/私有访问规则,不过都可以通过 classname::成员 进行访问,不论成员是私有还是共有三:使用类的static成员 对类的static成员的使用以下几种方式都可以 通过cla...
阅读全文
摘要:来自:http://blog.csdn.net/wbj1234566/article/details/2256642简单的讲:把类外部的类或函数声明为友元类和友元函数,使其能直接访问类中的私有成员。格式: friend 类 或 函数 声明//此语句可以放在类中的任意位置,与访问权限保留字无关。需要注意几个方面:1.友元关系是不可以传递的。比方说你是我的友元而Joe是你的友元,但这并不意味着Joe是我的友元。2.友元关系不能继承。3.友元关系不是互通。把class A设置为class B的友元并不会使得class B成为class A的友元,也许你愿意把你的秘密告诉我,但是,这并不意味着我愿意把
阅读全文
摘要:一些成员函数改变对象,一些成员函数不改变对象。例如: int Point::GetY(){return yVal;} 这个函数被调用时,不改变Point对象,而下面的函数改变Point对象: void Point:: SetPt (int x, int y){xVal=x;yVal=y;} 为了使成员函数的意义更加清楚,我们可在不改变对象的成员函数的函数原型中加上const说明: class Point { public:int GetX() const;int GetY() const;void SetPt (int, int);void OffsetPt (int, int);priva.
阅读全文
摘要:关联容器与顺序容器的本质区别在于:关联容器是通过键(key)存储和读取元素的,而顺序容器则通过元素在容器中的位置顺序存储和访问元素。 关联容器支持通过键来高效地查找和读取元素,两个基本的关联容器是map和set。map的元素是“键-值”对的二元组形式:键用作元素在map中的索引,而值则表示所存储和读取的数据。set仅包含一个键,并有效地支持关于某个键是否存在的查询。set和map类型的对象所包含的元素都具有不同的键。如果需要一个键对应多个实例,则需要使用multimap或multiset类型。这两种类型允许多个元素拥有相同的键。map 关联数组:元素通过键来存储和读取 set 大小可变的...
阅读全文
摘要:dynamic_cast <new_type> (expression)dynamic_cast运算符,应该算是四个里面最特殊的一个,因为它涉及到编译器的属性设置,而且牵扯到的面向对象的多态性跟程序运行时的状态也有关系,所以不能完全的使用传统的转换方式来替代。但是也因此它是最常用,最不可缺少的一个运算符。与static_cast一样,dynamic_cast的转换也需要目标类型和源对象有一定的关系:继承关系。 更准确的说,dynamic_cast是用来检查两者是否有继承关系。因此该运算符实际上只接受基于类对象的指针和引用的类转换。从这个方面来看,似乎dynamic_cast又和re
阅读全文
摘要:前面讲了C++继承并扩展C语言的传统类型转换方式,最后留下了一些关于指针和引用上的转换问题,没有做详细地讲述。C++相比于C是一门面向对象的语言,面向对象最大的特点之一就是具有“多态性(Polymorphism)”。要想很好的使用多态性,就免不了要使用指针和引用,也免不了会碰到转换的问题,所以在这一篇,就把导师讲的以及在网上反复查阅了解的知识总结一下。C++提供了四个转换运算符:const_cast <new_type> (expression)static_cast <new_type> (expression)reinterpret_cast <new_typ
阅读全文
摘要:C++标准转换运算符static_caststatic_cast <new_type> (expression)虽然const_cast是用来去除变量的const限定,但是static_cast却不是用来去除变量的static引用。其实这是很容易理解的,static决定的是一个变量的作用域和生命周期,比如:在一个文件中将变量定义为static,则说明这个变量只能在本Package中使用;在方法中定义一个static变量,该变量在程序开始存在直到程序结束;类中定义一个static成员,该成员随类的第一个对象出现时出现,并且可以被该类的所有对象所使用。对static限定的改变必然会造成
阅读全文
摘要:reinterpret_cast运算符是用来处理无关类型之间的转换;它会产生一个新的值,这个值会有与原始参数(expressoin)有完全相同的比特位。什么是无关类型?我没有弄清楚,没有找到好的文档来说明类型之间到底都有些什么关系(除了类的继承以外)。后半句倒是看出了reinterpret_cast的字面意思:重新解释(类型的比特位)。我们真的可以随意将一个类型值的比特位交给另一个类型作为它的值吗?其实不然。IBM的C++指南里倒是明确告诉了我们reinterpret_cast可以,或者说应该在什么地方用来作为转换运算符:从指针类型到一个足够大的整数类型从整数类型或者枚举类型到指针类型从一个指
阅读全文
摘要:再谈为何会有那四个转换运算符看起来,我应该把导师讲过、遗漏的有关C++类型转换方面的内容都总结成文了,主要内容都在以上几篇文章中阐述完毕。上边的每一篇文章,虽然都单独着重强调一种转换方式或运算符,但是也有提到跟其他运算符之间的差异性,以及使用建议,因此基本可以看出各个运算符的使用方式和作用。在文章也看到const_cast, reinterpret_cast, static_cast都可以用传统的转换方式基于指针进行替代。如果结合typeid运算符,那么dynamic_cast其实也可以用传统转换方式实现。因此不免会有疑惑:这四个转换运算符不是很多余。的确,我刚接触这些转换运算符的时候,我也又
阅读全文
摘要:一个由C/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 堆(heap):由malloc,new等分配的空间的地址,地址由低向高增长(程序员释放)。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。 栈(stack):是自动分配变量,以及函数调用所使用的一些空间(所谓的局部变量),地址由高向低减少; 3、全局区(静态区)(static)— 全局变量和静态变量的存储是放在一块的...
阅读全文
摘要:(1)编译器处理方式不同define宏是在预处理阶段展开。const常量是编译运行阶段使用。(2)类型和安全检查不同define宏没有类型,不做任何类型检查,仅仅是展开。const常量有具体的类型,在编译阶段会执行类型检查。(3)存储方式不同define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存。const常量会在内存中分配(可以是堆中也可以是栈中)。
阅读全文
摘要:今天看到accelerated c++上有个简单的vector容器的实现Vec,就再vs2008上编译了下:?///// Vec.h #ifndef GUARD_VEC_H #define GUARD_VEC_H #include #include #include //#include template class Vec { public: typedef T* iterator; typedef const T* const_iterator; typedef size_t size_type; typedef T value_type; typedef T& referenc.
阅读全文
摘要:网友1:今天在编写《编程之美》上的代码,遇到了如下的问题: void function(int &array[5]) { //………… } void main() { int arr[5]={1,2,3,4,5}; function(arr); } 为什么不正确呢??求真相~~ 非常感谢网友2:void function(int &array[5])形参的...
阅读全文

浙公网安备 33010602011771号