
C++
一枚小码农
这个作者很懒,什么都没留下…
展开
-
C++ 关于argc、argv的用法说明
argc 是 argument count的缩写,表示传入main函数的参数个数;argv 是 argument vector的缩写,表示传入main函数的参数序列或指针,并且第一个参数argv[0]一定是程序的名称,并且包含了程序所在的完整路径,所以确切的说需要我们输入的main函数的参数个数应该是argc-1个;#include using namesp转载 2017-10-27 13:52:02 · 1167 阅读 · 0 评论 -
回调函数
在理解“回调函数”之前,首先讨论下函数指针的概念。函数指针(1)概念:指针是一个变量,是用来指向内存地址的。一个程序运行时,所有和运行相关的物件都是需要加载到内存中,这就决定了程序运行时的任何物件都可以用指针来指向它。函数是存放在内存代码区域内的,它们同样有地址,因此同样可以用指针来存取函数,把这种指向函数入口地址的指针称为函数指针。(2)先来看一个Hello World程转载 2017-12-25 21:10:41 · 186 阅读 · 0 评论 -
typedef typename 作用
C++ typedef typename 作用C++的一些语法让人看着费解,其中就有:typedef typename std::vector::size_type size_type;1详见《C++ Primer》(第五版)P584 有些不懂的语法有时候虽然知道大概是什么意思,忽略一下就过了其实,不过心里老是膈应,就刨根问底一次吧。vector::size_t转载 2017-12-30 19:39:28 · 221 阅读 · 0 评论 -
移动构造函数
移动构造:移动构造是C++11标准中提供的一种新的构造方法。在现实中有很多这样的例子,我们将钱从一个账号转移到另一个账号,将手机SIM卡转移到另一台手机,将文件从一个位置剪切到另一个位置…… 移动构造可以减少不必要的复制,带来性能上的提升。有些复制构造是必要的,我们确实需要另外一个副本;而有些复制构造是不必要的,我们可能只是希望这个对象换个地方,移动一下而已。转载 2017-12-06 11:07:45 · 25588 阅读 · 5 评论 -
rand()和srand()产生为随机数方法
标准库(被包含于中)提供两个帮助生成伪随机数的函数: 函数一:int rand(void);从srand (seed)中指定的seed开始,返回一个[seed, RAND_MAX(0x7fff))间的随机整数。 函数二:void srand(unsigned seed);参数seed是rand()的种子,用来初始化rand()的起始值。 可以认为rand()在每次被调用的转载 2017-11-22 00:52:16 · 358 阅读 · 0 评论 -
C++ 设计模式
http://blog.youkuaiyun.com/column/details/design.html转载 2017-11-22 00:51:35 · 148 阅读 · 0 评论 -
IO库总结
和文件有关系的输入输出类主要在fstream.h这个头文件中被定义,在这个头文件中主要被定义了三个类,由这三个类控制对文件的各种输入输出操作,他们分别是ifstream、ofstream、fstream,其中fstream类是由iostream类派生而来,他们之间的继承关系见下图所示。由于文件设备并不像显示器屏幕与键盘那样是标准默认设备,所以它在fstream.h头文件中是没有像c转载 2017-11-28 21:13:10 · 143 阅读 · 0 评论 -
四大强制转换符
在C++中主要有四种强制类型转换:static_cast,reinterpret_cast,const_cast,dynamic_cast。1)static_cast(a)将地址a转换成类型T,T和a必须是指针、引用、基本数据类型或枚举类型。在运行时转换过程中,不进行类型检查来确保转换的安全性。class B { ... };class D : public B { ...转载 2017-11-09 17:00:43 · 955 阅读 · 0 评论 -
RTTI
RTTI概念RTTI(Run Time Type Identification)即通过运行时类型识别,程序能够使用基类的指针或引用来检查着这些指针或引用所指的对象的实际派生类型。RTTI机制的产生为什么会出现RTTI这一机制,这和C++语言本身有关系。和很多其他语言一样,C++是一种静态类型语言。其数据类型是在编译期就确定的,不能在运行时更改。然而由于面向对象程序设计中多态转载 2017-11-09 16:59:41 · 249 阅读 · 0 评论 -
如何理解c和c++的复杂类型声明
曾经碰到过让你迷惑不解、类似于int * (* (*fp1) (int) ) [10];这样的变量声明吗?本文将由易到难,一步一步教会你如何理解这种复杂的C/C++声明。 我们将从每天都能碰到的较简单的声明入手,然后逐步加入const修饰符和typedef,还有函数指针,最后介绍一个能够让你准确地理解任何C/C++声明的“右左法则”。 需要强调一下的是,复杂的C/C++声明并不是好的编转载 2017-11-08 21:33:30 · 279 阅读 · 0 评论 -
指针详解
指针的概念指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区。让我们分别说明。 先声明几个指针放着做例子: 例一: int *ptr; char *ptr; int **ptr; int (*pt转载 2017-11-08 20:58:21 · 193 阅读 · 0 评论 -
函数指针
一、最简单的函数指针 变量都包括声明和赋值,指针不例外,函数指针也不例外。我们来看一个简单的函数:void add(int a, int b){ cout endl;} 一个简单的加法计算并输出到命令行的函数。 那么如何通过函数指针来调用它呢? 1、声明:void (*p1)(int a, int b); 函数指针的声明很简单,基本转载 2017-11-08 14:59:18 · 154 阅读 · 0 评论 -
类中的静态成员变量和静态成员函数的作用
数据成员可以分为静态变量、非静态变量两种。静态成员:静态类中的成员加入static修饰符,即是静态成员,可以使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会分配内存,所以静态成员不能访问非静态成员,因为静态成员存在于内存,所以非静态成员可以直接访问类中的静态成员。非静态成员:所以没有加static的成员都是非静态成员,当类被实例化后,可以通过实例转载 2017-11-07 14:41:36 · 2020 阅读 · 0 评论 -
断言与静态断言
断言是很早之前就有的东西了,只需要引入cassert头文件即可使用。往往assert被用于检查不可能发生的行为,来确保开发者在调试阶段尽早发现“不可能”事件真的发生了,如果真的发生了,那么就表示代码的逻辑存在问题。最好的一点就是,断言只在Debug中生效,因此对于Release版本是没有效率上的影响的。 #include #include using namespace std;转载 2017-11-06 21:46:21 · 513 阅读 · 0 评论 -
MessageBoxA 弹出对话框函数
弹对话框 #include#includevoid main(){ MessageBoxA(0, "第一个C窗体程序", "消息", 3); //参数1:系统弹出 // 参数2:消息内容 // 参数3:标题 // 参数4:对话框的类型 // 0 只有 确定 按钮; // 1 确定 取消 按钮; // 2 终止 重试 忽略 按钮 // 3 是 否原创 2017-11-06 21:00:54 · 12705 阅读 · 2 评论 -
extern "C" {}
引言在用C++的项目源码中,经常会不可避免的会看到下面的代码:123456789#ifdef __cplusplusextern "C" {#endif /*...*/ #ifdef __cplusplus}转载 2018-01-03 18:53:45 · 433 阅读 · 0 评论