C/C++知识库
小凡1991
我就是我
展开
-
C++中指针和引用的异同
从概念上讲。指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变。而引用是一个别名,它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化,而且其引用的对象在其整个生命周期中是不能被改变的(自始至终只能依附于同一个变量)。在C++中,指针和引用经常用于函数的参数传递,然而,指针传递参数原创 2017-05-14 09:58:35 · 664 阅读 · 2 评论 -
C++之“using namespace std”的浅析
对于一个存在着标准输入输出的C++控制台程序,一般会在#include 的下一行发现一句话,using namespace std。这句话其实就表示了所有的标准库函数都在标准命名空间std中进行了定义。其作用就在于避免发生重命名的问题。关于命名空间namespace C++引入了命名空间namespace主要解决了多个程序员在编写同一个项目中可能出现的函数等重名的现象。解决方法就是加上自原创 2016-07-10 22:10:09 · 945 阅读 · 0 评论 -
C++之静态联编与动态联编及virtual关键字的作用
定义将一个调用函数连接上正确的被调用函数,这个过程就叫做函数的联编,简称联编。在C++中,一共有两种联编的方式:静态联编#define:静态联编是指联编工作出现在编译连接阶段。特点:① 静态联编就是指被调用函数和执行调用函数之间的关系以及它们在内存中的地址在编译的时候已经确定好了,运行时不会发生变化。② 由于对象不用对自身进行跟踪,因此速度浪费比较小,但是灵活性较差。原创 2016-07-10 21:35:21 · 1075 阅读 · 0 评论 -
数组拾遗
本文的目的就是为了记录平常用数组的时候不是很注意的问题!!!下标越界#include using namespace std;int main(){ int b[10]; b[10]=3; cout<<"b[10]="<<b[10]<<endl;}上面这个程序会输出b[10]=3;但是只要我们细心就可以发现,b[10]其实只包括了从b[0]~b[9]。那原创 2016-07-10 16:04:42 · 279 阅读 · 0 评论 -
函数指针及其运用
引言我们都知道,数组名就是指向数组第一个元素的常量指针。同理,对于一个函数而言,函数名也是指向函数第一条指令的常量指针。而编译器要做的就是在程序编译之后,为每个函数分配一个首地址,即该函数第一条指令的地址。一般情况下,我们可以用一个指针来保存这个地址,而这个指针就是函数指针,该指针可以看作是它指向函数的别名,所以我们可以用该指针来调用这个函数。函数指针的声明方法type (*func)原创 2016-07-09 23:07:09 · 568 阅读 · 0 评论 -
析构函数前加virtual关键字的作用?
大家知道,析构函数是为了在对象不被使用之后释放它的资源,虚函数是为了实现多态。那么把析构函数声明为vitual有什么作用呢?请看下面的代码:#includeusing namespace std;class Base{public: Base() {}; //Base的构造函数 ~Base() //Base的析构函数 { cout << "Output from the d原创 2016-06-28 14:39:57 · 4747 阅读 · 0 评论 -
C++ sizeof关键字的使用总结
1. 定义sizeof是一个操作符(operator)。其作用是返回一个对象或类型所占的内存字节数。其返回值类型为size_t。(size_t在头文件stddef.h中定义,它依赖于编译系统的值,一般定义为 typedef unsigned int size_t;)2. 语法sizeof有三种语法形式:1) sizeof (object); //sizeof原创 2016-06-09 22:35:19 · 1155 阅读 · 0 评论 -
C++重载<<和>>(输入输出运算符)
在C++中,系统已经对左移右移运算符分别进行了重载,使其能够用于输入输出,但是输入输出的处理对象只能是系统内建的数据类型。系统重载这两个运算符是以系统类成员函数的形式进行的,因此:cout如果自定义了一种新的数据类型,需要用输入输出运算符去处理,那么就要重载。重载输入运算符:下面用全局函数的形式重载输入运算符,使它能够读入两个double类型的数据,并转换为一个复数,保存到复数对象原创 2015-11-26 14:50:00 · 3344 阅读 · 0 评论 -
C++之类的组合(聚合)
在我们对现实中的某些事物抽象成类时,可能会形成很复杂的类,为了更简洁的进行软件开发,我们经常把其中相对比较独立的部分拿出来定义成一个个简单的类,这些比较简单的类又可以分出更简单的类,最后由这些简单的类再组成我们想要的类。比如,我们想要创建一个计算机系统的类,首先计算机由硬件和软件组成,硬件又分为CPU、存储器等,软件分为系统软件和应用软件,如果我们直接创建这个类是不是很复杂?这时候我们就可以将CP原创 2016-06-23 23:23:40 · 13180 阅读 · 3 评论 -
C/C++常量指针和指针常量的区别
常量指针和指针常量的区别:C/C++中关键字const用来定义一个只读的变量或者对象有以下优点:(1)便于类型检查(2)功能类似于宏定义,方便参数的修改和调整(3)节省空间(4)为函数重载提供参考C/C++中常把指针和常量混合起来使用,其最大的用途就是作为函数形式参数,保证实参在被调函数中的不可改变的特性,那到底常量指针和指针常量有什么区别呢?首先一定要明白哪种定义方式原创 2016-05-02 15:34:40 · 554 阅读 · 0 评论 -
C++矩阵和向量之间的操作
进行数据分析时,常需要显示矩阵和向量,以及取出矩阵的某一行或者某一列并将它存成向量,或将向量存到矩阵的某一列或某一行。以下程序展示了这类操作:#include "stdafx.h"#include #include #include using namespace std;const int M = 4;const int N = 5;void ShowMatrix(doubl原创 2016-04-17 21:58:15 · 3472 阅读 · 0 评论 -
C++之输出格式的总结
使用格式操作符设置数值的输出格式文件存储格式的设置文件的存储与cout的用法相同,都是使用数据流的概念,只是把cout以输出文件数据流取代而已。以下程序以矩阵的存储为例来说明存储大量数据的输出格式问题:#include "stdafx.h"#include #include #include using namespace std;const int M原创 2016-04-17 16:43:58 · 1168 阅读 · 0 评论 -
C++双冒号(::)的用法
(1)表示“域操作符”比如声明了一个类A,类A里声明了一个成员函数voidf(),但没有在类的声明里给出f的定义,那么在类外定义f时,就要写成voidA::f(),表示这个f()函数是类A的成员函数。例如01 class CA { 02 public: 03 int ca_var; 04 int add(int a, int b); 05 int add(i原创 2015-12-01 21:28:42 · 43004 阅读 · 11 评论 -
C++之深浅复制剖析
对象的复制 对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a=88; int b=a; double f=3.12; double d(f); 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种数据成员。下面看一个类对象复制的简单例子。#include using namespace std; class Test { pri原创 2016-06-19 09:33:22 · 399 阅读 · 0 评论 -
C++ 中memset 、 ZeroMemory危险需慎用
文章转自:http://blog.csdn.net/tjunxin/article/details/8540259使用C/C++编程时,常使用ZeroMemory、memset或 “={0}”来对结构体对象进行初始化或清零。然而这三种方式都有各自的特点,使用时需谨慎,否则容易出现严重错误,本人今日解决一个导致宕机的bug,查了几小时,才发现是由同事乱用ZeroMemory所致。转载 2017-05-13 07:40:04 · 998 阅读 · 1 评论 -
new与malloc的区别?
new与malloc的10点区别:1. 申请的内存所在位置new操作符从自由存储区(free store)上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。而堆是操作系统中的术语,是操作系统所维护的一块特殊内存,用于程序的内存动态分配,C语言使用mal原创 2017-05-12 19:34:46 · 420 阅读 · 0 评论 -
C++必须使用【初始化列表】初始化数据成员的三种情况
类对象的构造顺序是这样的:1.分配内存,调用构造函数时,隐式/显示的初始化各数据成员;2.进入构造函数后在构造函数中执行一般赋值与计算。使用初始化列表有两个原因:原因1.必须这样做:《C++ Primer》中提到在以下三种情况下需要使用初始化成员列表: 情况一、需要初始化的数据成员是对象的情况(这里包含了继承情况下,通过显示调用父类的构造函数对父类数据成员进行初始化);原创 2016-12-15 15:13:18 · 42763 阅读 · 9 评论 -
C/C++语言库函数atoi字符串转换成整型数
函数功能:atoi (表示 ascii to integer)是把字符串转换成整型数的一个函数;原型:int atoi(const char *nptr);函数说明:atoi( ) 函数会扫描参数 nptr字符串,跳过前面的空白字符(例如空格,tab缩进等,可以通过isspace( )函数来检测),直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结原创 2016-12-14 21:44:03 · 1698 阅读 · 0 评论 -
C++类构造函数初始化列表及初始化成员变量的误区
构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。例如:class CExample {public: int a; float b; //构造函数初始化列表 CExample(): a(0),b(8.8) {} //构造函数内部赋值 CExample() {原创 2016-12-14 20:13:06 · 6097 阅读 · 0 评论 -
单链表的结构体定义与声明
原文链接:http://www.nowamagic.net/librarys/veda/detail/2221在用代码描述单链表之前,我们需要定义一个结构体来描述单链表的结点。1typedef struct Node2{3 ElemTyp转载 2016-10-01 09:59:27 · 17686 阅读 · 2 评论 -
结构体链表小结
引用自身的结构体,一个结构体中有一个或多个成员的基类型就是本结构体类型时,说明这个结构体可以引用自己,所以称作引用自身的结构体。例如下面的结构体: struct link{ char ch; struct link *p} a; p是一个可以指向struct link类型变量的指针成员,这样,a.p=&a就是合法的表达式。那么,这有什么意义呢?这原创 2016-10-01 09:51:49 · 2246 阅读 · 0 评论 -
printf计算参数是从右到左压栈的原理(a++和++a的压栈的区别)
一、问题c++代码:#include #include using namespace std;int main(){ int a=1; cout" "//12 a=1; cout" "//21 a=1; printf("%d %d\n",a,a++);//21 a=1; printf("%d %d\n",a原创 2016-10-01 09:18:25 · 3309 阅读 · 1 评论 -
C++异常处理
程序中的错误分为编译时的错误和运行时的错误。编译时的错误主要是语法错误,这类错误比较容易修改,因为编译系统会指出运行错误在第几行,什么错误。而运行时的错误则不容易修改,因为其中的错误是不可预料的,或者可以预料但无法避免,比如内存空间不够,或者在调用函数时,出现数组越界等错误。我们把程序运行时的错误统称为异常,对异常的处理称为异常处理。C++中所提供的异常处理机制结构清晰,在一定程度上可以保证程原创 2015-12-23 16:26:14 · 422 阅读 · 0 评论 -
c++字符串
概念区分在c中,是没有string类型数据的。但是c语言里有这个头文件。区分string的含义:(1)如果string表示字符串型数据,那么c中是有字符串类型数据的(用char[]或者char *来声明定义)。但是没有string类型数据。而c中的这个头文件里声明的函数原型也是针对char数组的种种操作。(2)(c++中)string可以表示string类型。string是一种特殊原创 2015-11-25 14:31:25 · 585 阅读 · 0 评论 -
C++中static关键字的使用总结
1、初始化下代码中能够正确执行,在控制台中输出0,static int x语句做了两件事:定义了一个变量;将变量x初始化为0.#include #include int main(void){ //int y; static int x; //printf("%d %d",x,y); printf("%d", x);}下面代码发生错误#include #in原创 2015-11-28 14:41:08 · 530 阅读 · 0 评论 -
C++之多重继承
大多数应用程序使用单个基类的公用继承,但是在某些情况下,单继承是不够的,必须使用多继承。C++允许为一个派生类指定多个基类,这样的继承结构被称做多重继承.举个例子,交通工具类可以派生出汽车和船连个子类,但拥有汽车和船共同特性水陆两用汽车就必须继承来自汽车类与船类的共同属性。如下图示:代码实现://多重继承#include using namespace std;class原创 2016-04-16 22:42:18 · 2773 阅读 · 0 评论 -
C++文件的存取
实例:#include #include using namespace std;double CalculateTax(double);int main(){ char* FileNameIn = "Income.txt"; char* FileNameOut = "Tax.txt"; double Income, Tax; ifstream FileInput;//原创 2016-04-16 21:11:14 · 852 阅读 · 0 评论 -
c++11特性里的多线程thread的用法
创建和启动一条C++线程就像在C++源码中添加线程头文件那么简便。我们来看看如何创建一个简单的带线程的HelloWorld:#include #include using namespace std; //This function will be called from a thread//该函数将在一条线程中得到调用 void call_from_thread() { c原创 2016-04-16 15:04:57 · 5730 阅读 · 0 评论 -
二维数组和指针的关系
在C/C++中,数组和指针有着密切的关系,但是二者是完全不同的数据结构。二维数组是数组的数组,数组的每一个元素是一个数组。1、那么怎么利用一个数组的访问方式来访问二维数组呢?首先,定义一个二维数组int iArr[2][3]={0,1,2,3,4,5};我们可以用一个指向int型的指针变量来访问这个数组,下面代码是将数组一维化:int*p=iArr[0];上面的iArr原创 2015-11-28 21:06:29 · 1117 阅读 · 0 评论 -
单链表的修改和删除
单链表建立和单链表的插入完了以后,如果要对链表进行修改和删除,用以下代码:#include "stdafx.h"#include#includeusing namespace std;struct Student{ string name; string score; Student *next;//定义了指向Candidate类型变量的指针};Student * Creat原创 2015-11-28 22:19:24 · 7065 阅读 · 3 评论 -
单链表的插入操作
单链表的建立中已经建立了一个链表,若要在两个同学之间插入一个同学的成绩代码如下:#include "stdafx.h"#include#includeusing namespace std;struct Student{ string name; string score; Student *next;//定义了指向Candidate类型变量的指针};Student *原创 2015-11-28 21:58:44 · 1502 阅读 · 0 评论 -
c++中exit的使用
#include // 使用atexit()函数所必须包含的头文件stdlib.h#include using namespace std;void terminateTest(){ cout << "程序正在结束..." << endl;}int main(void){ // 注册退出处理函数 atexit(terminateTest); cout << "the原创 2015-11-28 15:16:13 · 4273 阅读 · 0 评论 -
C++变量及初始化的总结
C++类中变量的初始化规则:1、除了静态全局变量,所有其它变量都不可以在定义的时候初始化2、常量数据成员,必须在构造函数成员列表中初始化3、普通的数据成员,可以在函数列表中初始化,也可以在构造函数内部初始化看下例:class initialVar{ public: static const int c = 0; int a,d; cons原创 2015-11-28 14:57:02 · 445 阅读 · 0 评论 -
C++中随机函数rand()和srand()的用法
1、rand()函数名: rand 功 能: 随机数发生器 用 法: int rand(void); 所在头文件: stdlib.h 函数说明 : rand()的内部实现是用线性同余法做的,它不是真的随机数,因其周期特别长,故在一定 的范围里可看成是随机的。原创 2015-11-27 15:33:51 · 815 阅读 · 0 评论 -
C++用全局函数重载运算符
运算符重载函数既可以声明为类的成员函数,也可以声明为所有类之外的全局函数。将运算符重载函数声明为全局函数时,二元操作符需要两个参数,一元操作符需要一个参数,而其中必须有一个参数是对象,好让编译器区分这是程序员自定义的运算符。以下例子是用全局运算符重载计算复数的和:#include using namespace std;class complex{private: doubl原创 2015-11-26 14:30:26 · 5300 阅读 · 0 评论 -
C++运算符重载
所谓重载就是赋予新的含义。函数重载可以让一个函数名有多种功能,在不同情况下进行不同的操作。运算符重载也是这个道理,同一个运算符可以有不同的功能。C++允许程序员自己重载运算符。下面代码定义了一个复数类,通过运算符重载,用“+”号实现了复数的加法运算:#include using namespace std;class complex{private: double real;原创 2015-11-26 13:53:31 · 552 阅读 · 0 评论 -
C++基类和派生类的赋值
在C/C++中,经常会发生数据类型转换,例如整形数据可以赋值给浮点型变量,在赋值之前,先把整形数据转换为浮点型。数据类型转换的前提是,编译器知道如何对数据进行取舍。类也是一种数据类型,也可以发生数据类型转换。不过这种转换只有在基类和派生类之间才有意义。由于派生类包含从基类继承的成员,因此可以将派生类的对象赋值给基类对象。实际上,对象之间的赋值是成员变量的赋值,成员函数不存在赋值问题。在原创 2015-11-26 15:33:43 · 1953 阅读 · 0 评论 -
extern关键字使用方法总结
extern在源文件A里定义的函数,其他源文件里是不能访问的。为了在源文件B里能调用这个函数,应该在B的头部加上一个外部声明:extern 函数原型;这样,在源文件B里也可以调用那个函数了。注意:A里是定义,B里是声明。一个函数只能也必须在一个源文件里被定义,但是可以在其他多个源文件里被声明。定义引起存储分配,是真正产生那个实体;而声明并不引起存储分配。例子:p原创 2015-11-25 15:47:57 · 726 阅读 · 0 评论 -
c结构体、c++结构体和类的区别
c结构体,就是数据的集合,只有成员变量,没有方法;c++结构体和c++类基本一样,可以有成员变量,有方法,唯一的区别就是结构体成员变量默认访问控制为public,类为private。c与c++结构体的区别:1、c中结构体不能为空,而c++中的结构体可以为空。在c++中若结构体为空,则其大小为12、c结构体中只能定义成员变量,而不能定义成员函数,而c++结构体则可以有成员变量原创 2015-11-25 15:37:15 · 699 阅读 · 0 评论 -
C++中单链表的建立
单链表的建立和输出:#include "stdafx.h"#include#includeusing namespace std;struct Student{ string name; string score; Student*next;//定义了指针};int main(){ int n; cout << "请输入学生的总数:"; cin >> n; int原创 2015-11-28 21:48:00 · 925 阅读 · 0 评论