C++语言
文章平均质量分 53
学习、研究C++基础、深奥用法;探索C++精粹
H-KING
学海无涯
展开
-
C++控制台日志
#if !defined(_LOGFILE_H__261C9DDC_AB17_4781_B87F_4B82DD38DD13__INCLUDED)#define _LOGFILE_H__261C9DDC_AB17_4781_B87F_4B82DD38DD13__INCLUDED#if _MSC_VER >= 1000#pragma once#endif // _MSC_VER >原创 2014-09-25 21:49:54 · 2141 阅读 · 0 评论 -
C++中函数指针的使用
在C/C++中存在着函数指针,即指向函数的指针。我目前已知的两种使用方法是: [cpp] view plaincopy#include #include typedef int* PINNT; #define PP int* int funcA(int a,int b); int funcB(int转载 2015-03-23 12:57:27 · 712 阅读 · 0 评论 -
C++中空指针调用类成员函数的原理
有下面的一个简单的类:class CNullPointCall{public: static void Test1(); void Test2(); void Test3(int iTest); void Test4();private: static int m_iStatic; int m_iTest;};转载 2015-03-23 14:28:58 · 772 阅读 · 0 评论 -
C++虚函数---我的理解
先了解一些基础知识1.构造函数和析构函数一般是公有成员,否则该类不能实例化2.类成员默认访问权限是private类型(strcut默认访问权限是public) 3.析构函数一般是虚函数,否则可能会造成内存泄漏4.拥有虚函数的的类都会有一个虚表,该虚表的指针位于类的首地址虚表展示: 5.没有虚函数的类,首地址是成员变量(先后顺序和在类声明里面的一直,与公私有无关原创 2015-03-23 19:26:38 · 625 阅读 · 0 评论 -
C++运算符重载
C++中预定义的运算符的操作对象只能是基本数据类型,实际上,对于很多用户自定义类型,也需要有类似的运算操作。例如: class complex { public: complex(double r=0.0,double I=0.0){real=r;imag=I;} void display(); private: double real;转载 2015-03-24 11:04:10 · 461 阅读 · 0 评论 -
c语言中的static变量和static函数
在C语言中,static的字面意思很容易把我们导入歧途,其实它的修饰变量作用有三条。(1)先来介绍它的第一条也是最重要的一条:隐藏。当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为理解这句话,我举例来说明。我们要同时编译两个源文件,一个是a.c,另一个是main.c。下面是a.c的内容char a = 'A'; // global va转载 2015-03-27 13:58:58 · 537 阅读 · 0 评论 -
C++中的mutable关键字
mutalbe的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词。 在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。 我们知道,如果类的成员函数不会改变对象的状态,那么这个成员函数一般会声明成const的。但是,有些时候,我们需要在const的转载 2015-03-31 10:34:02 · 468 阅读 · 0 评论 -
C++静态成员和静态成员函数
类中的静态成员真是个让人爱恨交加的特性。我决定好好总结一下静态类成员的知识点,以便自己在以后面试中,在此类问题上不在被动。 静态类成员包括静态数据成员和静态函数成员两部分。 一 静态数据成员: 类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成员。和其他数据成员一样,静态数据成员也遵守public/protected/private访问规则。同时转载 2015-03-31 10:39:13 · 471 阅读 · 0 评论 -
C++中的友元关系
在封装中C++类数据成员大多情况是private属性;但是如果接口采用多参数实现肯定影响程序效率;然而这时候如果外界需要频繁访问这些私有成员,就不得不需要一个既安全又理想的“后门”——友元关系;C++中提供三种友元关系的实现方式,友元函数、友元成员函数、友元类。友元函数:既将一个普通的函数在一个类中说明为一个friend属性;其定义(大多数会访问该类的成员)应在类后;友元成员函数:转载 2015-03-31 16:37:57 · 538 阅读 · 0 评论 -
C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区
栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。在一个进程中,位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数的调用。和堆一样,用户栈在程序执行期间可以动态地扩展和收缩。 堆,就是那些由 new 分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个 new 就要对应一个 delete。如果程序员没有释转载 2015-04-08 18:59:46 · 461 阅读 · 0 评论 -
c++中的pod类型
最早看到POD(plain old data)类型,是在imperfect c++里。我觉得这是一本把我带到c++世界里的一本很重要的书。书里是这样解释POD的:1、 所有标量类型(基本类型和指针类型)、POD结构类型、POD联合类型、以及这几种类型的数组、const/volatile修饰的版 本都是POD类型。2、 POD结构/联合类型:一个聚合体(包括转载 2015-04-08 19:04:17 · 572 阅读 · 0 评论 -
关于typedef的用法总结
不管实在C还是C++代码中,typedef这个词都不少见,当然出现频率较高的还是在C代码中。typedef与#define有些相似,但更多的是不同,特别是在一些复杂的用法上,就完全不同了,看了网上一些C/C++的学习者的博客,其中有一篇关于typedef的总结还是很不错,由于总结的很好,我就不加修改的引用过来了,以下是引用的内容(红色部分是我自己写的内容)。用途一:定义一种类型的别名,而不转载 2015-04-10 12:59:46 · 444 阅读 · 0 评论 -
_cdecl和_stdcal的区别
分类: VS2010 C++ 调试LRESULT就是LONGCALLBACK专用在回调函数里,看看VC/BCB里的定义VC:WINDEF.h#define CALLBACK PASCAL //_pascal#define WINAPI CDECL //_cdecl BCB:windef.h #define CALLBACK __stdcall #define WINAPI转载 2015-04-16 20:50:03 · 1127 阅读 · 0 评论 -
static_cast, dynamic_cast, const_cast学习和探讨
一 C语言中存在着两种类型转换:隐式转换和显式转换隐式转换:不同数据类型之间赋值和运算,函数调用传递参数……编译器完成1) 算术转换(Arithmetic conversion) : 在混合类型的算术表达式中, 最宽的数据类型成为目标转换类型。2) 一种类型表达式赋值给另一种类型的对象:目标类型是被赋值对象的类型3) 将一个表达式作为实参传递给函数调用,此时形参和实参类型不一致原创 2015-04-17 20:28:00 · 607 阅读 · 0 评论 -
__declspec(novtable) 的用法
__declspec(novtable) 在C++中接口中广泛应用. 不容易看到它是因为在很多地方它都被定义成为了宏. 比如说ATL活动模板库中的ATL_NO_VTABLE, 其实就是__declspec(novtable).__declspec(novtable) 就是让类不要有虚函数表以及对虚函数表的初始化代码, 这样可以节省运行时间和空间. 但是这个类一定不允许生成实例, 因为没转载 2015-04-19 10:22:47 · 715 阅读 · 0 评论 -
C,C++中使用可变参数
可变参数即表示参数个数可以变化,可多可少,也表示参数的类型也可以变化,可以是int,double还可以是char*,类,结构体等等。可变参数是实现printf(),sprintf()等函数的关键之处,也可以用可变参数来对任意数量的数据进行求和,求平均值带来方便(不然就用数组或每种写个重载)。在C#中有专门的关键字parame,但在C,C++并没有类似的语法,不过幸好提供这方面的处理函数,本文将重点转载 2015-04-21 14:28:19 · 541 阅读 · 0 评论 -
new A和new A()的区别详解
我们在C++程序中经常看到两种new的使用方式:new A以及new A()。那么这两种究竟有什么区别呢?调用new分配的内存有时候会被初始化,而有时候不会,这依赖于A的类型是否是POD(Plain old data)类型,或者它是否是包含POD成员、使用编译器生成默认构造函数的类。附:POD类型POD是Plain old data的缩写,它是一转载 2015-04-29 21:01:06 · 794 阅读 · 0 评论 -
C++ POD(Plain Old Data)类型
群里发过来一份他们公司的笔试题,看了下,发现里面考了一个判断如下是否为POD类型,没搞明白什么是POD,多方查阅后,发现其实是指一个C风格代码的概念。POD全称Plain Old Data是指C风格的struct结构体定义的数据结构,其中struct结构体中只能定义常规数据类型(不能含有自定义数据类型)。它仅作为被动的收藏的字段值,不使用封包或者other object-oriented特转载 2015-04-29 21:05:13 · 577 阅读 · 0 评论 -
C++ POD与结构体声明
请看下面这个结构体定义:[cpp] view plaincopystruct MyStruct { int i; wstring str; vector strs; }; 上面的结构休定义有问题吗?理论上说没有,但在某些情况下就有问题了。如下用法:转载 2015-04-29 22:42:58 · 663 阅读 · 0 评论 -
C/C++中static关键字详解
静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0,使用时可以改变其值。 静态变量或静态函数只有本文件内的代码才能访问它,它的名字在其它文件中不可见。用法1:函数内部声明的static变量,可作为对象间的一种通信机制 如果一局部变量被声明为static,那么将只有唯一的一个静态分配的对象,它被用于在该函数的所有调用中表示这个变量。这个对象将转载 2015-04-30 15:37:54 · 430 阅读 · 0 评论 -
C++ 关键字typeid
在揭开typeid神秘面纱之前,我们先来了解一下RTTI(Run-Time Type Identification,运行时类型识别),它使程序能够获取由基指针或引用所指向的对象的实际派生类型,即允许“用指向基类的指针或引用来操作对象”的程序能够获取到“这些指针或引用所指对象”的实际派生类型。在C++中,为了支持RTTI提供了两个操作符:dynamic_cast和typeid。 d转载 2015-05-04 21:51:30 · 371 阅读 · 0 评论 -
C/C++函数调用约定
关于 C/C++ 函数调用约定,大多数时候并不会影响程序逻辑,但遇到跨语言编程时,了解一下还是有好处的。VC 中默认调用是 __cdecl 方式,Windows API 使用 __stdcall 调用方式,在 DLL 导出函数中,为了跟 Windows API保持一致,建议使用 __stdcall 方式。调用约定跟堆栈清除密切相关。如果写一个汇编函数,给 C/C++ 调用,在 __cdec转载 2015-05-08 10:47:46 · 1311 阅读 · 0 评论 -
函数调用方式__stdecl _stdcall _fastcall __thiscall介绍
__cdecl 是C DECLaration的缩写(declaration,声明),表示C语言默认的函数调用方法:所有参数从右到左依次入栈,这些参数由调用者清除,称为手动清栈。被调用函数不会要求调用者传递多少参数,调用者传递过多或者过少的参数,甚至完全不同的参数都不会产生编译阶段的错误。 _stdcall 是StandardCall的缩写,是C++的标准调用方式:所有参数从右到左依次入栈,转载 2015-05-08 11:10:26 · 429 阅读 · 0 评论 -
__stdcall和__cdecl的区别
__stdcall和__cdecl是两种函数名字修饰。(注意是连续的两个下划线)Windows上windows上不管是C还是C++,默认使用的都是__stdcall方式。不论__stdcall还是__cdecl函数参数都是从可向左入栈的,并且由调用者完成入栈操作。对于__stdcall方式被调用者自身在函数返回前清空堆栈;而__cdecl则由调用者维护内存堆栈,所以调用者函数生转载 2015-05-08 12:08:31 · 545 阅读 · 0 评论 -
memmove和memcpy
1.memmove函数原型:void *memmove(void *dest, const void *source, size_t count)返回值说明:返回指向dest的void *指针参数说明:dest,source分别为目标串和源串的首地址。count为要移动的字符的个数函数说明:memmove用于从source拷贝count个字符到dest,如果目标区域和源区域有重转载 2015-05-19 18:12:10 · 454 阅读 · 0 评论 -
C++ 私有成员变量的理解
私有成员变量的概念,在脑海中的现象是,以private关键字声明,是类的实现部分,不对外公开,不能在对象外部访问对象的私有成员变量.然而,在实现拷贝构造函数和赋值符函数时,在函数里利用对象直接访问了私有成员变量,因而,产生了困惑.下面以具体实例进行说明:疑惑:为什么第26行和第32行代码可以编译通过,而第39行和第40行代码会产生编译错误? 1 class CTest {转载 2015-05-21 21:16:41 · 664 阅读 · 0 评论 -
安全编程: 防止缓冲区溢出
防止如今最常见的程序缺陷本文讨论 Linux/UNIX 系统中最常见的缺陷:缓冲区溢出。本文首先解释什么是缓冲区溢出,以及它们为何如此常见和如此危险。然后讨论广泛用于解决缓冲区溢出的新 Linux 和 UNIX 方法 ―― 以及为什么这些方法还不足够。随后将展示 C/C++ 程序中防止缓冲区溢出的各种方法,同时包括静态调整大小的方法(比如标准的 C 库和 OpenB转载 2015-05-21 21:39:51 · 919 阅读 · 0 评论 -
内存泄露、内存溢出以及解决方法
目录(?)[+]内存泄露是指程序在运行过程中动态申请的内存空间不再使用后没有及时释放,从而很可能导致应用程序内存无线增长。更广义的内存泄露包括未对系统的资源的及时释放,比如句柄等。内存溢出即用户在对其数据缓冲区操作时,超过了其缓冲区的边界;尤其是对缓冲区写操作时,缓冲区的溢出很可能导致程序的异常。一.内存泄露“知己知彼,方能百战不殆”,如果我们能够比较清楚的了解在编转载 2015-05-22 10:16:57 · 4805 阅读 · 0 评论 -
C++内存管理
[导语]内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对C++的痛恨,但内存管理在C++中无处不在,内存泄漏几乎在每个C++程序中都会发生,因此要想成为C++高手,内存管理一关是必须要过的,除非放弃C++,转到Java或者.NET,他们的内存管理基本是自动的,当然你也放弃了自由和对内存的支转载 2015-05-22 12:55:28 · 573 阅读 · 0 评论 -
控制台多彩字体
#include "stdafx.h"#include #include void cprintf(char* str, WORD color, ...);int main() {cprintf("H", 10);cprintf("e", 9);cprintf("l", 12);cprintf("l", 11);cprintf("o", 13);cp转载 2015-05-22 16:52:48 · 489 阅读 · 0 评论 -
虚函数的“陷阱”
首先要说明,我不是一个理论派,很少努力的阅读课外书籍,只是用到的时候才去找。因此理论上有缺失,导致对本文出现的“陷阱”认识不足。当然,对于一些专业知识比较强的朋友来说,这不是“陷阱”,只是对我当前的知识水平而言。 先举个例子吧,更好说明情况。假设有两个类,有两个虚函数。[cpp] view plaincopy#if !defined F转载 2015-06-08 15:24:12 · 463 阅读 · 0 评论 -
HeapAlloc与malloc的区别
malloc是在CRT的内存堆上分配的,这个堆的存在一般来说你是不会关心的HeapAlloc则不同,你需要给它指定你想从哪个堆上分配,而这个堆是从HeapCreate创建出来的HeapAlloc大多是用于自己管理堆的情况malloc可以移植是因为在不同的操作系统上有各自的实现,而所有平台上就叫这个名字。比如在Widnows上,VC中调用malloc时,其实在malloc内部就是转载 2015-06-08 18:31:32 · 646 阅读 · 0 评论 -
sscanf,sscanf_s及其相关用法(字符串格式化为其他类型)
#include 定义函数 int sscanf (const char *str,const char * format,........);函数说明 sscanf()会将参数str的字符串根据参数format字符串来转换并格式化数据。格式转换形式请参考scanf()。转换后的结果存于对应的参数内。返回值 成功则返回参数数目,失败则返回-1,错误原因存于er转载 2015-06-11 09:43:44 · 1274 阅读 · 0 评论 -
c++空类实例大小不是0原因
初学者在学习面向对象的程序设计语言时,或多或少的都些疑问,我们写的代码与最终生编译成的代码却 大相径庭,我们并不知道编译器在后台做了什么工作.这些都是由于我们仅停留在语言层的原因,所谓语言层就是教会我们一些基本的语法法则,但不会告诉我们为什么这么做?今天和大家谈的一点感悟就是我在学习编程过程中的一点经验,是编译器这方面的一个具体功能.首先:我们要知道什么是类的实例化,所谓类的实例化就是在内转载 2015-07-08 17:22:38 · 449 阅读 · 0 评论 -
重载->运算符(感觉怪怪的)
// tt.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"class A{public: void print() { printf("1111111\n"); }};class Test{public: Test(){} ~Test(){}public: A * operator->() { return ge原创 2015-07-15 18:02:45 · 484 阅读 · 0 评论 -
C禁用控制台
//禁用窗口模式#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")原创 2015-08-06 12:20:47 · 831 阅读 · 0 评论 -
C语言register关键字—最快的关键字
register:这个关键字请求编译器尽可能的将变量存在CPU内部寄存器中,而不是通过内存寻址访问,以提高效率。注意是尽可能,不是绝对。你想想,一个CPU 的寄存器也就那么几个或几十个,你要是定义了很多很多register 变量,它累死也可能不能全部把这些变量放入寄存器吧,轮也可能轮不到你。一、皇帝身边的小太监----寄存器 不知道什么是寄存器?那见过太监没有?没有?转载 2015-08-09 11:31:29 · 508 阅读 · 0 评论 -
C与C++在形参的一点小区别
C与C++在形参的一点小区别原创 2015-08-10 12:19:57 · 769 阅读 · 0 评论 -
空结构体和空类
今天看到一片博客说面试被问空结构体大小的问题,发现这个问题以前还真没想过。于是自己试了一把,并在网上找了些资料总结如下:空结构体,先上代码1234567891011#include typedef empty{}a; int转载 2015-08-19 18:38:43 · 717 阅读 · 0 评论 -
静态函数调用非静态函数的小例子
// tt.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"class A{public: void fun() { printf("1111111111"); } static void fun2() { fun(); }};int _tmain(int argc, _TCHAR* argv[]){ A a; A:原创 2015-08-19 19:02:16 · 2118 阅读 · 0 评论