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)
![](http://images.cnitblog.com/blog/591365/201312/14220335-37f74299bd154d88a9fb75c8fd7dbbaa.jpg)
2、程序结构说明:
预处理头文件
各函数声明
主函数
{
主函数体
}
各函数的定义
头文件:每个C++/C程序通常分为两个文件。一个文件用于保存程序的声明(declaration),称为头文件。另一个文件用于保存程序的实现(implementation),称为定义(definition)文件。 C++/C程序的头文件以“.h”为后缀,C程序的定义文件以“.c”为后缀,C++程序的定义文件通常以“.cpp”为后缀(也有一些系统以“.cc”或“.cxx”为后缀)。
一般来说,头文件提供接口,源文件提供实现。但是有些实现比较简单的,也可以直接写在头文件里,这样头文件接口实现一起提供。
3.参数的传递
用引用传递参数?
4.数组
数组的初始化:
数据类型 数组名[常量表达式]={初始化值1 ,初始化值2 ,……初始化值n};
内存和地址
变量在内存中是由若干个相邻的“房子”拼接而成的,而数组在内存中则是由若干个相邻的数组元素按顺序拼接而成的。每个数组元素又相当于一个变量。左图是一个大小为3 的短整型(short )数组在内存中的情况。
sizeof(数组名或数据类型);
5.指针
它和整型、字符型、浮点型一样,是一种数据类型。指针中存储的并不是所要调用的数据本身,而是所要调用的数据在内存中的地址。指针本身也是一种数据类型。
不同指针类型的本质在于不同的操作。
声明
指针的类型 *指针变量名;
获取地址和指针变量初始化
获取数据在内存中的地址:取地址操作符 &
没有初始化的指针变量是危险的。可是如果在声明变量之后,找不到合适的地址进行初始化,我们该怎么办呢?显然,随便找个地址对指针变量做初始化是不负责任的。
在这里,我们引入一个特殊的地址——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.类的声明和定义
成员函数也是可以在类的定义中定义的(此时不需要域解析操作符),但是从程序的运行效率、可读性、美观性考虑,我们建议将成员函数的定义完全放在类定义的外面。
:: 域解析操作符
Ctrl+L剪切一行
格式化代码:Alt+F8
F5: 开始调试
Shift+F5: 停止调试
F10: 调试到下一句,这里是单步跟踪
F11: 调试到下一句,跟进函数内部
Shift+F11: 从当前函数中跳出
Ctrl+F10: 调试到光标所在位置
F9: 设置(取消)断点
Alt+F9: 高级断点设置
1、数据类型(vc)
![](http://images.cnitblog.com/blog/591365/201312/14220335-37f74299bd154d88a9fb75c8fd7dbbaa.jpg)
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; }
相关文章推荐
- C++多重继承
- C++中int,float,string,char*的转换(待续)
- 孙鑫VC++视频学习笔记-第3课
- C++ vector容器类型 , C++ vector用法
- C++继承后的析构函数的调用
- C++类的继承
- c++ 如何使用CryptoAPI创建一个自签名证书
- c++的友元类
- malloc/free与new/delete区别
- vc++经典技巧总结
- C语言数组名相互赋值
- poj2643(map+字典树)
- C++11:兼容性
- 嵌入式学习之路(十)——C语言学习(5)
- berkerly db 中简单的读写操作(有一些C的 还有一些C++的)
- c++重载overload和重写overrid的区别
- 15-C语言结构体
- 14-C语言宏
- 2013-C++第16周项目参考解答链接集
- 山东理工大学ACM平台题答案关于C语言 2101 正方形面积