您的位置:首页 > 编程语言 > C语言/C++

C++基础知识

2013-12-14 21:58 393 查看
vc6快捷键:

Ctrl+L剪切一行

格式化代码:Alt+F8

F5: 开始调试

Shift+F5: 停止调试

F10: 调试到下一句,这里是单步跟踪

F11: 调试到下一句,跟进函数内部

Shift+F11: 从当前函数中跳出

Ctrl+F10: 调试到光标所在位置

F9: 设置(取消)断点

Alt+F9: 高级断点设置

1、数据类型(vc)



2、程序结构说明:

预处理头文件

各函数声明

主函数

{

主函数体

}

各函数的定义

头文件:每个C++/C程序通常分为两个文件。一个文件用于保存程序的声明(declaration),称为头文件。另一个文件用于保存程序的实现(implementation),称为定义(definition)文件。 C++/C程序的头文件以“.h”为后缀,C程序的定义文件以“.c”为后缀,C++程序的定义文件通常以“.cpp”为后缀(也有一些系统以“.cc”或“.cxx”为后缀)。

一般来说,头文件提供接口,源文件提供实现。但是有些实现比较简单的,也可以直接写在头文件里,这样头文件接口实现一起提供。

3.参数的传递

用引用传递参数?

4.数组

#include "iostream.h"
int  main()
{
int array[5]; // 声明一个可以存放五个整数的数组
for (int i=0;i<5;i++) // 如果写成 i<=5 就要出问题了
{
array[i]=i+1;// 对各数组元素赋值
}
for ( int j=0;j<5;j++)
{
cout <<array[j] <<"  ";// 输出各数组元素
}
cout <<endl;
return  0;
}


数组的初始化:

数据类型 数组名[常量表达式]={初始化值1 ,初始化值2 ,……初始化值n};

int array[]={0,3,4,8};
这句语句就相当于:
int array[4]={0,3,4,8};


内存和地址

变量在内存中是由若干个相邻的“房子”拼接而成的,而数组在内存中则是由若干个相邻的数组元素按顺序拼接而成的。每个数组元素又相当于一个变量。左图是一个大小为3 的短整型(short )数组在内存中的情况。

sizeof(数组名或数据类型);

5.指针

它和整型、字符型、浮点型一样,是一种数据类型。指针中存储的并不是所要调用的数据本身,而是所要调用的数据在内存中的地址。指针本身也是一种数据类型。

不同指针类型的本质在于不同的操作。

声明

指针的类型 *指针变量名;

char  *cptr; // 指向字符型变量的指针变量
int *iptr; // 指向整型变量的指针变量
要注意,当我们要声明多个指针变量时,必须在每个指针变量名前加上* ,例如:
int *iptr1,*iptr2,iptr3; //iptr1 和iptr2 是指向整型变量的指针变量,而 iptr3 是整型变量


获取地址和指针变量初始化

获取数据在内存中的地址:取地址操作符 &

没有初始化的指针变量是危险的。可是如果在声明变量之后,找不到合适的地址进行初始化,我们该怎么办呢?显然,随便找个地址对指针变量做初始化是不负责任的。
在这里,我们引入一个特殊的地址——NULL。它的意思是“空”,即指针没有指向任何东西。比如:

int *iptr=NULL;
要注意的是,C++ 是大小写敏感的,NULL 与null 是不同的。所以,在使用的时候必须要大写。

指针也是一种变量,在内存中也有地址

指针变量也是一种变量,有着自己的值和它自身在内存中的地址

指针的操作

对于指针类型来说,可以使用的运算有:和整数做加法运算、和整数做减法运算、两指针做关系运算。很显然,指针类型的乘除法是没有意义的,也是不允许的。

指针的加减法运算:

  指针和整数C 的加减法是指针向前或向后移动C 个对应类型的存储区域,即可以得到以下公式:

  新地址=旧地址±C*每个对应数据类型的变量在内存中所占字节数

指针的关系运算:

  等于和不等于就是判断两个指针的值是否相同或者不相同,即两个指针是否指向了相同或不相同的地方。

  大于和小于,值较小的在存储器中的位置比较靠前。

常量指针(常量的指针,指向的内容是不能修改的)

  只能内存中的数据,不能修改内存数据,比如:const int *iptr;

  这样只是防止通过间接引用iptr修改内存中的数据,并不保护iptr本身和iptr所指向的变量。

指针常量(指针类型的常量,指针本身不能修改,但是可以修改指向的数据)

  指针常量是指正所指向的位置不能改变,即指针本身是一个常量。但是指针常量可以通过间接引用修改内存中的数据。定义指针常量的语句格式为:

  指针类型 * const 指针常量名=&变量名;

  const int *captr=&a; // 常量指针 指针所指向的内容不能修改

  int * const acptr=&a; // 指针常量 指针指向的位置不能改变

  数组名并不是一个普通的变量,而是一个指向数组首元素的指针。是一个指针常量,不能被修改,不能做左值。

  结论:数组名a 和b 都是指向数组首元素的指针,所以a=b; 并不能把数组b 的数据复制给数组a 。

  向函数传递数组是将指针作为参数的特殊形式。

  由于指针可以直接操作内存中的数据,所以它可以用来修改实参。

  为了避免指针作为函数参数导致数据被意外修改,我们可以使用 const 来保护指针指向的数据,

指针函数

  把返回指针的函数称为指针函数。

  int * max(int *array, int size); // 返回值类型是 int * ,即整型指针

  所以指针函数必须返回一个函数结束运行后仍然有效的地址值。

堆内存

  数组的存储空间必须在程序运行前申请,即数组的大小在编译前必须是已知的常量表达式

  在C++ 中,允许我们在程序运行时根据自己的需要申请一定的内存空间,我们把它称堆内存(Heap)空间。

  申请堆内存空间:new 数据类型[表达式];

  对于普通变量和数组,在程序结束运行以后,系统会自动将它们的空间回收。然而对于我们自己分配的堆内存空间,大多数系统都不会将它们回收。如果我们不人为地对它们进行回收,只“借”不“还”,那么系统资源就会枯竭,电脑的运行速度就会越来越慢,直至整个系统崩溃。我们把这种只申请空间不释放空间的情况称为内存泄露(Memory Leak)

  delete [] 指向堆内存首元素的指针;

6.对象

  创建一个对象的方法是:类名 对象名(初始化数据);

  而创建一个模板类对象的方法是:类名< 数据类型列表> 对象名(初始化数据); 相当于是java中的泛型

  

 向量

  vector<char > stack(0);// 新建一个名为 stack的存放字符数据的向量,初始元素个数为 0

7.类的声明和定义

  成员函数也是可以在类的定义中定义的(此时不需要域解析操作符),但是从程序的运行效率、可读性、美观性考虑,我们建议将成员函数的定义完全放在类定义的外面。

  :: 域解析操作符

  

class  Node // 定义一个链表结点类
{
public :
int readi() const; // 通过该函数读取 idata ,但不能改变任何成员数据
char  readc()  const; // 通过该函数读取 cdata,但不能改变任何成员数据
bool  set( int i);// 重载,通过该函数修改 idata
bool  set( char  c); // 重载,通过该函数修改 cdata
bool  setp(Node *p);/ / 通过该函数设置前驱结点
bool  setn(Node *n);// 通过该函数设置后继结点
private :
int idata; // 存储数据保密
char  cdata; // 存储数据保密
Node *prior;// 前驱结点的存储位置保密
Node *next;// 后继结点的存储位置保密
}; // 类定义结束,分号切勿忘记
int Node::readi()  const// 成员函数 readi 的定义
{
return  idata;
}
char  Node::readc() const
{
return  cdata;
}
bool  Node::set( int i) // 重载成员函数定义
{
idata=i;
return  true;
}
bool  Node::set( char  c)
{
cdata=c;
return  true;
}
bool  Node::setp(Node *p)
{
prior=p;
return  true;
}
bool  Node::setn(Node *n)
{
next=n;
return  true;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: