
c++学习心得
文章平均质量分 60
lmsnju
这个作者很懒,什么都没留下…
展开
-
智能指针的实现及原理
本文主要讨论C++程序设计的一种常用技术——智能指针(smart pointer),主要内容包括引用计数(reference count)和句柄类(handle class)。如果文中有错误或遗漏之处,敬请指出,谢谢! 作者: tyc611, 2007-02-01 当类中有指针成员时,一般有两种方式来管理指针成员:一是采用值型的方式管理,每个类对象都保留一份指针指向的对转载 2009-10-27 19:17:00 · 8888 阅读 · 0 评论 -
C语言中sizeof与strlen区别
一.本质区别 sizeof和strlen有本质上的区别。sizeof是C语言的一种单目运算符,如++、--等,并不是函数,sizeof的优先级为2级,比/、% 等3级运算符优先级高,sizeof以字节的形式给出操作数的存储空间的大小。而strlen是一个函数,是由C语言的标准库提供的。strlen计算的 是字符串的长度。 二.使用区别 1.sizeof sizeof的操作数转载 2009-12-05 20:24:00 · 360 阅读 · 0 评论 -
sizeof(struct)
struct MyStruct { double dda1; char dda; int type; }; 对结构MyStruct采用sizeof会出现什么结果呢?sizeof(MyStruct)为多少呢?也许你会这样求:sizeof(MyStruct)=sizeof(double)+sizeof(char)+sizeof(int)=13但是当在VC中测试上面结构的大小时,你会发现size转载 2009-12-08 20:31:00 · 251 阅读 · 0 评论 -
一个c内存分配问题
今天一个C/C++群里的几个朋友在谈论一个C的内存分配问题,这个问题是先由一个朋友提出的,它写了如下一段代码:char *p = (char *)malloc(10);p = "akdfa";char *q = (char *)realloc(p, 25);结果在运行时出错了.然后大家展开了讨论,结果无果而终。由于在群上不太容易表达自己的想法,下面我把自己和一个朋友的理解写一下转载 2009-12-09 14:44:00 · 247 阅读 · 0 评论 -
我对const修饰符应用的理解
先说说我对编译器对const处理的理解:const修饰符定义一个常量,const变量在整个程序中只有一个拷贝。编译器会跟踪所有用到这个常量的地方,一旦发现任何一个操作可能会改变这个它是常量这个属性,那么这个操作就是不合法的: const int val =10; int* pTemp=&val; //不合法,因为用户可能试图通过pTemp指针改变v转载 2009-12-09 14:59:00 · 450 阅读 · 0 评论 -
关于构造函数和析构函数的一些例子
今天去参加了c++考试,题不难,但是看程序写结果全是和构造函数、析构函数有关的,平时我认为我在这方面绝对没有问题的,不就是一个构造函数么,那有什么难的,可是当我真正面对试题的时候,我才知道我下笔是那么的犹豫,这也是许多人面试结果不理想的原因吧----平时忽略了基础知识的积累,但是公司面试的时候就要看你对基础知识的掌握程度。话不多说,先看看下面的例子:#include using namespa转载 2009-12-09 15:20:00 · 396 阅读 · 0 评论 -
c,c++内存运行时深入研究
C/C++内存与运行时深入研究 [作者Jean.Love] -----------------------------------------------------------------------------------(一)整数符号的陷阱 (二)浮点数的本质 (三)堆栈的内存管理结构 (四)符号解析 (五)对齐和总线错误 (六)函数指针 (七)转载 2010-02-03 10:54:00 · 585 阅读 · 0 评论 -
typedef与define的区别
typedef用法 与#define typedef根据名字就知道是对类的定义。但是值得注意的是,它并不定义新的类型,而是对已有的类型定义一个其他的名字。本人生就略愚,常常搞不清与#define的关系,难道仅仅是所定义得到的新类型所在的位置不同吗?首先我们仔细看看typedef。一、typedef的用法人说typedef的使用可以编写更加美观和可读的代码,原因是typedef可以隐藏笨转载 2009-12-10 17:01:00 · 418 阅读 · 0 评论 -
文本流和二进制流
我们在写C程序的时候经常会涉及到对流的操作,比如说从标准输入流读取一串字符串,然后通过标准输出流输出显示在屏幕上,这也就是所谓的IO操作。那么流究竟是什么东西?下面首先对流这个概念做一下解释。一. 流(stream)的概念计算机有很多外部设备,比如键盘、鼠标、CD-ROM驱动器、硬盘、网络接口、视频适配器等。这些设备都和IO操作有关系,而每种设备都具有不同的特性和操作协议。操作系统负责实现转载 2009-12-13 19:01:00 · 273 阅读 · 0 评论 -
对钩子的认识
当时刚刚接触觉得有点无法理解,可是通过查msdn和上网搜索很快就有了粗浅的认识。对于一个屏蔽快捷键的钩子原理大概是这样的: 1.存在一个钩子处理函数(回调函数),和一个安置钩子的函数(vc下最常用的是SetWindowHookEx()) 2.安置钩子的函数将钩子处理函数注入到某进程的消息响应链中,从而能达到截获某些消息的效果。(我的理解:)) 3.钩子处理函数往往存在于一个dll文件中。(当转载 2009-12-14 11:18:00 · 480 阅读 · 0 评论 -
守护进程简介
守护进程又称精灵进程(daemon),一般在系统启动时开始,而在系统关闭时终止。没有控制终端,运行在后台。在linux系统中有很多这类进程。下面说一下如何创建一个守护进程。(1) 使用umask修改文件的屏蔽字,为文件赋予跟多的权限,因为继承来的文件可能某些权限被屏蔽,从而失去某些功能,如读写。 (2) 调用fork函数创建一个子进程,而父进程退出。 (3)转载 2009-12-28 15:09:00 · 266 阅读 · 0 评论 -
c++ style
Google的开源项目大多使用C++开发。每一个C++程序员也都知道,C++具有很多强大的语言特性,但这种强大不可避免的导致它的复杂,这种复杂会使得代码更易于出现bug、难于阅读和维护。本指南的目的是通过详细阐述在C++编码时要怎样写、不要怎样写来规避其复杂性。这些规则可在允许代码有效使用C++语言特性的同时使其易于管理。风格,也被视为可读性,主要指称管理C++代码的习惯。使用术语风格有点转载 2009-12-29 20:35:00 · 465 阅读 · 0 评论 -
分支的影响
首先本文讲的是一个很浅显的道理,如果觉得简单不要拍我,之所以突然对分支预测感兴趣,是因为曾经看到有个商业的数据分析程序是这样写的: If (version==0x001) && (vendor=abc) && (xxxx) Do something Else if (version=0x002) && (….) Do something Else if……我曾经看过长达20多个if-else组转载 2009-12-29 21:14:00 · 368 阅读 · 0 评论 -
构造函数和析构函数能否声明为虚函数?
构造函数不能声明为虚函数,析构函数可以声明为虚函数,而且有时是必须声明为虚函数。不建议在构造函数和析构函数里面调用虚函数。构造函数不能声明为虚函数的原因是: 解释一:所谓虚函数就是多态情况下只执行一个。而从继承的概念来讲,总是要先构造父类对象,然后才能是子类对象。如果构造函数设为虚函数,那么当你在构造父类的构造函数时就不得不显示的调用构造。还有一个原因就是为了防错,试想如果你在子类中一转载 2010-03-16 20:05:00 · 11255 阅读 · 3 评论 -
当友元遇到虚函数
前些天d2school QQ群里有网友在讨论这一内容,我试图做个整理。几点基本知识:1、如果类A是类B的友元,则类A(的成员函数)可以直接访问类B的私有成员。2、友元不能继承。也就是说,类A是类B的友元,类D是类B的派生类,则类A并不会直接是类D的友元。通俗一点,父亲的朋友,并不天生就是儿子的朋友。3、虚函数的基本知识就不说了。来看下面的几段代码:Code:clas转载 2009-12-01 13:40:00 · 252 阅读 · 0 评论 -
并发
文章出处:http://www.limodev.cn/blog 作者联系方式:李先静 嵌套锁与装饰模式嵌套锁的实现算法加锁: o如果没有任何线程加锁,就直接加锁,并且记录下当前线程的ID。 o如果是当前线程加过锁了,就不用加锁了,只是将加锁的计数增加一。 o如果其它线程加锁了,那就等待直到加锁成功,后继步骤与第一种情况相同。解锁: o如果不是当转载 2009-11-24 22:26:00 · 253 阅读 · 0 评论 -
new一些鲜为人知的用法!
1.在特定的内存位置建立一个对象:把car对象放在十六进制地址 0xfeedbabe中#include "stdafx.h"#include "new"using namespace std;class cat{ char name[20];};int main(int argc, char* argv[]){ void* place = (void*) 0xfeedbabe; ca转载 2009-10-27 18:25:00 · 431 阅读 · 0 评论 -
C++之参数传递方式
晚上研究生群里在讨论一个参数传递的问题,我也参加了讨论,搜索一篇博客中的文章,比较详细的介绍了参数传递效率,如下:众所周知,在C++中调用函数时有三种参数传递方式: (1)传值调用; (2)传址调用(传指针); (3)引用传递; 实际上,还有一种参数传递方式,就是全局变量传递方式。这里的“全局”变量并不见得就是真正的全局的,所有代码都可以直接访问的,只要这个变量的作用域足够这两个函数访问就可以了,转载 2009-10-27 18:42:00 · 551 阅读 · 0 评论 -
C++虚函数实现(二)
C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。关于虚函数的使用方法,我在这里不做转载 2009-10-28 17:27:00 · 397 阅读 · 0 评论 -
C++虚函数问题(三)
有三个类:A,B,C,A中有100个虚函数,B中有100个函数,C中有1000个虚函数,问这三个类的对象占用内存空间的大小次序?答案:A=C>B,原因是因为A和C的对象都要包含一个指向虚函数表的指针。原创 2009-10-28 20:51:00 · 242 阅读 · 0 评论 -
C++虚函数实现机制(一)
1、c++实现多态的方法其实很多人都知道,虚函数在c++中的实现机制就是用虚表和虚指针,但是具体是怎样的呢?从more effecive c++其中一篇文章里面可以知道:是每个类用了一个虚表,每个类的对象用了一个虚指针。具体的用法如下:class A{public: virtual void f(); virtual void g();private: int a};clas转载 2009-10-28 16:41:00 · 323 阅读 · 0 评论 -
C unsigned 用法
例:#define NELE(a) (sizeof(a) / sizeof(a[0])) int main() { char str[] = {E, M, C}; for (int d=-1; d printf("%c",str[d+1]); return 0; }判断printf()输出的是什么,结果可能出乎意料,什么也没有输出,原因呢?原因原创 2009-11-02 19:38:00 · 2026 阅读 · 1 评论 -
c++/c编程注意事项
容易错误的使用指针: void GetMemory(char *p, int num) { p = (char *)malloc(sizeof(char) * num); } void Test(void) { char *str = NULL; GetMemory(str, 100); // str 仍然为 NULL strcpy(str, "转载 2009-11-12 17:14:00 · 271 阅读 · 0 评论 -
c 线程的取消和终止
上次说了如何去创建一个线程及如何向线程中传递一个参数那么这次我们说一下如何终止一个线程。如进程中调用exit,_exit使进程结束一样,线程也可以通过类似的方法结束。一、线程的执行体结束线程自然结束。二、可以通过调用pthread_exit使程序结束。pthread_exit 的原型为: void pthread_exit(void *value_ptr);valu转载 2009-11-15 19:36:00 · 2595 阅读 · 0 评论 -
无符号右移
在Java及JavaScript中提供了无符号右移操作符“>>>”,无符号右移操作符与普通右移操作符“>>”的区别是>>在右移时将以符号扩展原则进行右移,即在右移过程中它将保持原有数据的正负号不变,简单地说,就是在右移正数时高位补0、右移负数时则高位补1,而无符号右移操作符>>>在右移时不考虑符号问题,即无论右移正数还是负数,其最高位都是补0。无符号右移本质上是将被右移的数所有存储位都视为数据转载 2009-11-15 19:42:00 · 1457 阅读 · 0 评论 -
常见的内存错误及其对策
发生内存错误是件非常麻烦的事情。编译器不能自动发现这些错误,通常是在程序运行时才能捕捉到。而这些错误大多没有明显的症状,时隐时现,增加了改错的难度。有时用户怒气冲冲地把你找来,程序却没有发生任何问题,你一走,错误又发作了。常见的内存错误及其对策如下: 内存分配未成功,却使用了它。 编程新手常犯这种错误,因为他们没有意识到内存分配会不成功。常用解决办法是,在使用内存之转载 2010-01-13 22:10:00 · 263 阅读 · 0 评论 -
解析大端模式和小端模式
一、概念及详解在各种体系的计算机中通常采用的字节存储机制主要有两种: big-endian和little-endian,即大端模式和小端模式。先回顾两个关键词,MSB和LSB:MSB:Most Significant Bit ------- 最高有效位 LSB:Least Significant Bit ------- 最低有效位大端模式(big-edian)b转载 2010-01-14 16:36:00 · 329 阅读 · 0 评论 -
c语言中宏定义和函数的取舍
要写好C语言,漂亮的宏定义是非常重要的。宏定义可以帮助我们防止出错,提高代码的可移植性和可读性等。 在软件开发过程中,经常有一些常用或者通用的功能或者代码段,这些功能既可以写成函数,也可以封装成为宏定义。那么究竟是用函数好,还是宏定义好?这就要求我们对二者进行合理的取舍。我们来看一个例子,比较两个数或者表达式大小,首先我们把它写成宏定义:#define MAX( a, b) ( (a)转载 2009-11-20 15:41:00 · 316 阅读 · 0 评论 -
创建进程后得到该进程的主窗口句柄
最近抽空用VC写了一个小应用程序。主要功能就是创建进程,并到该进程的主窗口句柄,然后再给该窗口发消息。下面把代码共享给大家。 HWND CreateMyProcess() { // 进程启动信息 STARTUPINFO si; memset(&si, 0, sizeof(STARTUPINFO)); si.cb = si转载 2009-11-24 21:58:00 · 382 阅读 · 0 评论 -
windows socket I/O模型
本文简单介绍了当前Windows支持的各种Socket I/O模型,如果你发现其中存在什么错误请务必赐教。 一:select模型 二:WSAAsyncSelect模型 三:WSAEventSelect模型 四:Overlapped I/O 事件通知模型 五:Overlapped I/O 完成例程模型 六:IOCP模型 老陈有一个在外地工作转载 2010-03-16 20:09:00 · 432 阅读 · 0 评论