关于C++和指针总结

来源:互联网 发布:淘宝宝贝主图制作 编辑:程序博客网 时间:2024/06/05 11:35
1、一个C 程序
#include <iostream>
#include<Windows.h>
using namespace std;

int main()
{
system("pause");
return 0;
}
2、关于函数类对象的一些概念
函数定义在其调用之前,或者在主函数中对需要被调用的函数做声明
类的变量:称为对象
类中包含两种成员:数据成员和成员函数
C++把一组数据和有权调用这些数据的函数封装在一起,组成一种称为类的数据结构
定义私有、公有、以实现信息的密闭

被定义为公有的数据或函数,既可以被本类中的成员函数调用也可以被类外的语句调用
定义为私有的成员,只能在类内调用(友元除外),以实现封装。
对象占用实际的存储空间、而类型不占用
3、字符与转义字符
转义字符
\n换行
\t水平制表
\0代表停止
\r代表退回当前行的起始位置
字符数据单引号引起来,'a'合法    'ab'不合法
字符数据只占据一个字节,只能存放0~255范围内整数
“aaaaa”字符串常量,最后一个字符为\0,占据6个字节

const关键字:变量值程序运行期间不能改变,这种变量称为常变量。定义常变量的同时,必须对其初始化
const int a = 3
也称为只读变量
强制类型转换, (int) a   或 int (a)
逗号表达式:
表达式1, 表达式2
求解过程:先求解表达式1,在求解表达式2。整个逗号表达式的值是表达式2的值。
逗号表达式的目的是获得各表达式的值,而非求最后的值,常用于for循环中。
4、函数的重载
表示同一个函数名的多用,参数个数、参数类型、或者参数顺序三者至少有一者不同
5、函数模板
建立一个通用函数,其函数类型和形参类型不具体指定,用虚拟的类型来代表这个通用函数。适用于函数体相同,函数参数个数相同,类型不同的情况。若参数个数不同则不能用函数模板
template <typename T>
template <class T>

#include <iostream>
using namespace std;
template<typename T>
T max ( T a, T b, T c)
{

}
6、有默认参数的函数
实参与形参结合的顺序是从左至右。指定默认值的参数必须放在形参列表的最右端。
如果函数定义在调用之前,则形参列表里直接注明默认参数
若在调用之后,函数声明语句需要写明默认参数,函数定义中不再写。一个函数不能既是重载函数、又是有默认参数的函数
7、变量
自动变量 auto:而动态局部变量(自动变量)属于动态存储类别,存储在动态存储区间,函数调用结束后释放。若不赋初值,不确定
静态局部变量 static:在静态存储区分配存储单元,在整个程序运行期间都不释放,在编译时赋初值,结束时保留上次执行的值。若不赋初值,则为0
用static声明的  静态外部变量,只限于本文件使用
加不加static 声明 的全局变量都采用静态存储方式,只是作用范围不同,均在编译时分配内存。
8、内部函数和外部函数
内部函数:一个函数只能被本文件中的其他函数调用
static int func(int a, int b)
外部函数:extern int func(int a, int b)
表示可以被其他文件调用,默认不写extern的都是外部函数
一般在需要调用此函数的文件中,用extern 声明所用的函数是外部函数。
9、指针和指针变量
指针:一个变量的地址,表示指向某一变量
指针变量:一个存放地址的变量

int *p   //定义了一个指针变量p
p = &i  //p存变量i的地址
*p 取p指向的变量
9.1 指针做函数参数:
Case 1: 正确 可以通过改变形参所指向的地址里的值,进而将其传递给实参
void swap(int *p1 , int *p2)
{
int temp;
temp = *p1;
*p1  = *p2;
*p2 = temp;
}
Case 2: 危险 temp指向的单元不可预见,是野指针
void swap(int *p1 , int *p2)
{
int *temp;
*temp = *p1;
*p1  = *p2;
*p2 = temp;
}
Case 3: 不正确 只是改变了形参指针的指向,不能反向传递
void swap(int *p1 , int *p2)
{
int temp;
temp = *p1;
*p1  = *p2;
*p2 = temp;
}
9.2 数组与指针
int a[10];
int *p;
p = &a[0];// p = a
也可写作:int *p = &a[0]
  • p+9和a+9的值是&a[9],其指向a[9]
  • *(p+i)或*(a+i),是其所指向的数组元素即a[i]
  • 实参的数组名a代表固定地址,可以看作指针常量,故a++是不可以的。但形参数组名是指针变量并不是固定的地址值,可以被改变。
9.3 字符串与指针
char str[] = "hello world";
string str = "hello world";
char *str = "hello world"
9.4 函数与指针
指针变量可以指向函数,函数编译时会被分配一个入口地址,即为函数指针。一个指针变量指向函数,然后可以通过指针变量调用此函数。
int (*p) (int , int);
int max(int x, int y);
p = max;
m = p(a, b);
p两侧的括号不能省略,表示指针指向函数,函数的返回值为整形,
int *p(int, int)表示返回值是指向整形的指针
9.5 返回指针值的函数:指针函数
9.7 指针数组
如果一个数组其元素均为指针类型的数据,该数组称为指针数组。
int *p[4];
表示数组中每一个元素都可以指向一个指针变量。
int (*p)[4]是指向一维数组的指针变量。
9.8 const指针
1 指向常量的指针变量:
const int *p = &a;
* p = 15  // error
不允许通过指针变量改变其指向的对象的值。但指针变量p的值是可以改变的如 p = &b, a的值也可以直接改变 a = 15
因此指向常量的指针变量只是限制了通过指针变量改变其指向对象的值,
2 常指针
char * const p1 = "china";
此时指针变量的指向不能改变
3 指向常量的常指针
指针变量指向一个固定的对象,该对象的值不能改变(不能通过指针变量改变该对象的值)
const int *const pt
10 引用
int a;
int &b = a
b是a的引用
对引用只有声明没有定义,声明一个引用时必须同时对其初始化,可用来传参






0 0
原创粉丝点击