
c/c++
文章平均质量分 67
jiangyi711
这个作者很懒,什么都没留下…
展开
-
static 函数
今天看代码的时候看见如下形式:static int function() { //code return value;} 以为返回的是一个static值,后来才知道原来是声明该函数是个static类型的函数,意义为该函数只能在本文件之内使用。后来又进一步看了一下static关键字的用法,现在自己总结一下,希望能对记忆有帮助。static的用法有两种,分原创 2009-11-06 02:33:00 · 671 阅读 · 0 评论 -
项目中的错误:类静态成员初始化
在项目中碰到一个类的静态成员初始化的问题,大概如下:// A.hclass A{ public: A(); void func(); private: static int a;};//A.cpp#include #include "test.h"using namespace std;//int A::a = 0;voidA::f原创 2010-04-25 15:29:00 · 1273 阅读 · 0 评论 -
项目中的错误:::域作用符
在项目中碰到一个问题,有关域作用符的,一开始百思不得其解,今晚终于有空查了资料,得到了答案。std::vector::SFT::Job::CreatNewMail::groupByDesIp(::std::vector inOneTask) { ::std::vector ret; ::std::wstring init = ::IceUtil::stringToWstring("in原创 2010-04-26 22:42:00 · 1605 阅读 · 0 评论 -
项目中的错误:默认参数重定义
mark原创 2010-04-26 22:42:00 · 1811 阅读 · 0 评论 -
项目中的错误:临时变量的生存期
在项目中碰到一个问题,在某个timer的构造函数中构造了一个对数据库的connection,但是在构造函数还没结束的时候connection就关闭了。后来才知道是因为临时变量的生存期的问题。大概的意思如下:#include using namespace std;class A { public: A():a(0) { cout << "A :: default cons原创 2010-04-28 15:35:00 · 780 阅读 · 0 评论 -
c程序的编译过程
在写项目的makefile文件时,被一个问题给堵住:项目的主程序是有很多service和job组成的,这些service和job中又用到了很多Dao。刚才一直在思考,因为主程序里只有引用到相关的service和job,所以在考虑,是否要对每个Dao生成目标文件,在链接最后的可执行程序时,要不要把Dao的目标文件链接进来。自己分析了半天找不到原因。在网上找到了这篇有关程序编译的文章,转转载 2010-05-04 00:34:00 · 5154 阅读 · 0 评论 -
项目中的错误:成员初始化列表
从概念上讲,构造函数分为两个阶段执行:初始化阶段,计算阶段。计算阶段由构造函数体中的所有语句组成。使用初始化式有两方面的原因,第一是必要性。有三种情况必须使用成员初始化列表。1. 没有默认构造函数的类成员。2. const成员3. 引用类型成员原因很简单,因为上面说了,初始化阶段是在构造函数体外就开始的。所以如果默认构造函数的话会无法初始化。而const和引用类型的成员,如果没有初始化列表,编译器原创 2010-05-07 09:46:00 · 964 阅读 · 0 评论 -
BSS段、数据段、代码段、堆与栈
BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。数据段:数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。代码段:代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读, 某些架构也允许代码转载 2010-07-17 03:12:00 · 617 阅读 · 0 评论 -
C++ TIPS
TIPS 1:#include #include using namespace std;int main(){ char str1[] = "abc"; char str2[] = "abc"; const char str3[] = "abc"; const char str4[] = "abc"; const char* str5 = "abc"; const char* str6 = "abc"; cout str1....str4分别是4个不原创 2010-07-19 21:30:00 · 557 阅读 · 0 评论 -
C++ TIPS
TIPS 1 : 下面代码输出的是什么?#include using namespace std;void foo(void) { unsigned int a = 6; int b = -20; (a + b > 6) ? puts("> 6") : puts("这个有关算数转换规则。算数转换规则定义了一个类型的转换层次,该层次规定了操作数按什么次序转换为表达式中最宽的类型。在众多类型的转换中,需要确保计算值的精度。有时候需要依赖于机器。例如:包含有unsigned原创 2010-07-20 04:01:00 · 449 阅读 · 0 评论 -
window 下大文件读写
#ifdef WIN32#include using namespace std;class WinLargeFile{public: WinLargeFile(std::string path, __int64 offset, char a) { _path = path; _wpath = s2ws(_path); switch (a) { case 'r': hFile = CreateF原创 2010-06-07 14:41:00 · 1014 阅读 · 0 评论 -
string.h中的几个函数实现
<br />typedef unsigned int size_t; void * memcpy ( void * destination, const void * source, size_t num ){ void* ret = destination; while (num--) { *(char*) destination = *(char*) source; destination = (char*) destination + 1; sourc原创 2010-08-18 17:16:00 · 665 阅读 · 0 评论 -
placement new
#include placement new。和其他普通的new不同的是,它在括号里多了另外一个参数。比如:Widget * p = new Widget; //ordinary newpi = new (ptr) int; //placement new括号里的参数是一个指针,它指向一个内存缓冲器,placement new将在这个缓冲器上分配一个对象。Placement new的返回值是这个被构造对象的地址(比如扣号中的传递参数)。placement new主要翻译 2010-09-27 01:42:00 · 1972 阅读 · 0 评论 -
C++ Traits
int * p;....int i = Foo(p); 今天看"modern c++ design"的时候发现自己竟然又把以前好不容易弄懂的Traits技术给忘记了,真是...又重新学习了一下,赶紧记下来。Traits技术可以用来获得一个 类型 的相关信息的。 首先假如有以下一个泛型的迭代器类,其中类型参数 T 为迭代器所指向的类型:template class myIterator{ ...};当我们使用myIterator时,怎样才能获知它所指向的元素的类型呢?我们可以为这个类加转载 2010-09-27 02:15:00 · 1733 阅读 · 0 评论 -
STL中的内存分配器
题记:内存管理一直是C/C++程序的红灯区。关于内存管理的话题,大致有两类侧重点,一类是内存的正确使用,例如C++中new和delete应该成对出现,用RAII技巧管理内存资源,auto_ptr等方面,很多C/C++书籍中都使用技巧的介绍。另一类是内存管理的实现,如linux内核的slab分配器,STL中的allocator实现,以及一些特定于某种对象的内存管理等。最近阅读了一些内存管理实现方面的资料和源码,整理了一下,汇编成一个系列介绍一些常用的内存管理策略。1. STL容器简介STL提供了很多泛型容器,转载 2010-10-10 01:12:00 · 2254 阅读 · 0 评论 -
重载(overload)、覆盖(override)、隐藏(hide)的区别
这三个概念都是与OO中的多态有关系的。如果单是区别重载与覆盖这两个概念是比较容易的,但是隐藏这一概念却使问题变得有点复杂了,下面说说它们的区别吧。重载是指不同的函数使用相同的函数名,但是函数的参数个数或类型不同。调用的时候根据函数的参数来区别不同的函数。覆盖(也叫重写)是指在派生转载 2010-07-21 21:26:00 · 568 阅读 · 1 评论 -
项目中的错误:类成员函数地址
项目中需要对一个recvArray进行排序,我用的是stl的sort,sort的最后一个参数本来是我定义的一个非静态成员函数,但是这样编译不能通过。后来换成静态成员函数编译通过。但是我还是想把cmp方法写成非静态函数,于是需要想办法获得cmp的地址。成员函数指针:在C++中,成员函数的指针是个比较特殊的东西。对普通的函数指针来说,可以视为一个地址,在需要的时候可以任意转换并直接调用。但对成员函数来原创 2010-04-23 10:31:00 · 2205 阅读 · 4 评论 -
项目中的错误:switch局部变量
遇到一个小问题,大概如下:#include using namespace std;int main() { int n = 0; switch( n ) { cout << "aa" << endl; case 1: int a = 10; //error break; default: ; } return 0;原创 2010-04-23 14:23:00 · 1174 阅读 · 0 评论 -
项目开发过程中出现的错误一
前天出现了一个比较低级的失误,记录如下:本来想要绑定端口6666,于是用了 htonl(6666)。这样把6666当成了一个32位的无符号整数。也就是 00000000,00000000,00011010,00001010转换成网络字节序就变成了 00001010,00011010,00000000,00000000。但是sockaddr_in结构中的sin_port是usigned原创 2009-11-06 02:41:00 · 545 阅读 · 0 评论 -
项目开发过程中出现的错误二
昨天在调试程序的时候出现了一个问题,有这样一个结构体:typedef struct _ip_statistic_item{ v_ushort_16 header; v_uint_32 ip_addr; v_short_16 l5_protocol; v_ushort_16 up_total_speed:10, up_原创 2009-11-06 02:43:00 · 606 阅读 · 0 评论 -
c++五种内存分配
在c++中,内存分为5个区域。分别是堆,栈,自由存储区,全局/静态存储区和常量存储区 栈 :由编译器在需要的时候分配,在不需要的时候自动清除的变量存储区。里面通常是局部变量,函数参数等。 堆 :由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。原创 2009-11-08 16:02:00 · 585 阅读 · 0 评论 -
c++ const修饰符用法
1.const修饰变量:说明该变量的值是不可更改的。并且const常量有数据类型检查,宏只进行简单的字符替换,没有类型安全检查。2.const修饰类数据成员:const类型的数据成员只在该对象生存期内是不可变的,而对于整个类来说是可变的。所以不能在类声明中初始化const数据成员,因为类的对象未被创建时,编译器不知道const数据成员的值是什么。const数据成员的初始化只能在构造原创 2009-11-10 22:05:00 · 702 阅读 · 0 评论 -
C++虚函数表解析
看到一篇写c++虚函数表的文章,写得非常好,决定转载过来。虚函数表对C++ 了解的人都应该知道虚函数(Virtual Function)是通过一张虚函数表(VirtualTable)来实现的。简称为V-Table。在这个表中,主是要一个类的虚函数的地址表,这张表解决了继承、覆盖的问题,保证其容真实反应实际的函数。这样,在有虚函数的类的实例中这个表被分转载 2009-11-12 20:31:00 · 640 阅读 · 0 评论 -
虚析构函数
还是一篇有关虚函数的文章,这次是解析虚析构函数的。先直接上代码吧。 #include using namespace std;class A{ public: int a; A() { cout<<"A"<<endl; } ~A(){ cout<<"~A"<<endl; }}class B{ public: A *pA; B()转载 2009-11-12 22:03:00 · 666 阅读 · 0 评论 -
c++宏展开的问题
今天碰到一个有关宏的问题,#include #define f(a,b) a##b#define g(a) #a#define h(a) g(a)int main() { printf("%s/n",h(f(1,2))); printf("%s/n",g(f(1,2))); return 0;} 输出是:12f(1,2)第一个printf本来应该是h(f(原创 2010-01-15 19:49:00 · 1642 阅读 · 0 评论 -
c语言int表示范围以及移位运算符
刚刚看到的几个小基础知识,记录一下:在int型为32位的硬件环境中,int的表示范围是:-2的31次方 到 2的31次方减1。原因:因为int是带符号类型,所以最高位为符号位,于是最大表示的正数是:01111111 11111111 11111111 11111111,也就是2的31次方减1。再来看最小值,-2的31次方的原码表示为10000000 00000000 00000000 000原创 2010-01-20 15:34:00 · 10532 阅读 · 0 评论 -
const函数重载
前段时间自己写了一个简单的List模板类,List类中有两个嵌套类,分别是const_iterator和iterator,其中后者是前者的子类。在重载List类的=操作符的时候,出现了一个编译上的问题,现在我把部分代码贴上来。#ifndef LIST_H#define LIST_H#include #include template class List{ priva原创 2009-11-26 18:43:00 · 1095 阅读 · 0 评论 -
c++继承中的内存布局
今天在网上看到了一篇写得非常好的文章,是有关c++类继承内存布局的。看了之后获益良多,现在转在我自己的博客里面,作为以后复习之用。 ——谈VC++对象模型(美)简.格雷程化 译 译者前言 一个C++程序员,想要进一步提升技术水平的话,应该多了解一些语言的语意细节。对于使用VC++的程序员来说,还应该了解一些VC++对于C++的诠释。 Inside the C++ Object转载 2009-11-27 20:48:00 · 13751 阅读 · 16 评论 -
在成员函数中delete this指针
刚才在TopLanguage上看到版主抛出来的一个问题,在成员函数中能不能delete this指针。我觉得是可以的,delete操作一般是先调用析构函数,再调用delete运算符。而且delete之后,该内存不会立刻被释放,只是做个标记,告诉操作系统这块内存可以被释放掉了。至于系统什么时候会释放是不知道的,所以delete this指针本身没问题,只是不能在delete this之后,访问对象的原创 2009-12-10 17:22:00 · 3760 阅读 · 2 评论 -
项目中的错误:const对象只能调用const函数
昨天在写一个HashTable的时候,出现了一个小错误,大概如下:class HashTable { public: function_1() const { function_2(function_3()); } function_2() {} function_3() {}}; 类似这原创 2009-12-16 14:06:00 · 1415 阅读 · 0 评论 -
构造函数
写这篇文章的目的是,巩固一下对构造函数的理解。参考《C++Primer 4》。1.构造函数可以被重载…………2.实参决定使用哪个构造函数…………3.构造函数自动执行…………4.用于const对象的构造函数构造函数不能声明为const。5.构造函数初始化式从概念上讲,构造函数分为两个阶段,(1)初始化阶段,(2)计算阶段,计算阶段由原创 2009-12-14 20:20:00 · 712 阅读 · 0 评论 -
c++内置类型
C++定义了一组表示整数、浮点数、单个字符和布尔值的算术类型(arithmetic types),另外还定义了一种称为void的特殊类型。void类型没有对应的值,仅用在有限的情况下。通常用作无返回值的函数的返回类型。算术类型的存储空间依机器而定。类型存储空间是指用来表示该类型的位(bit)数。C++标准保证了每个算术类型的最小存储空间,但它并不阻止编译器使用更大的存储空间。事实上,对于int类型转载 2010-01-05 23:57:00 · 7819 阅读 · 1 评论 -
项目中的一个小错误
最近在做一个有关ftp的项目,昨天的开发过程中出了一个小错误,现在记录一下。我再ftp服务器程序里面写了一段小程序,让ftp服务器把自己当成一个client去连接其他的ftp服务器并且发送本地文件到远程服务器。本来数据的传输已经成功,但是不明白为什么文件名总是缺少最后一个字母。比如说,Makefile传过去,变成了Makefil。后来才知道在传送一条控制信息的时候出错了。本来应该传输"STOR原创 2010-04-07 12:54:00 · 483 阅读 · 0 评论 -
行指针列指针
<br />#include <iostream>using namespace std;int main(){ int s1[3]; int (*p1)[3] = s1; // error, s1为列指针,p1为数组指针,这里理解为行指针 int (*p2原创 2010-08-15 13:36:00 · 1474 阅读 · 1 评论