c++笔记

函数

注意点一:形参&实参作用和区别

形参和实参的功能是传递数据,发生函数调用时,实参的值会传递给形参。

  1. 形参变量只有在函数被调用时才会分配内存,调用结束后,立刻释放内存,所以形参变量只有在函数内部有效,不能在函数外部使用。

  2. 实参可以是常量、变量、表达式、函数等,无论实参是何种类型的数据,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参,所以应该提前用赋值、输入等办法使实参获得确定值

  3. 实参和形参在数量上、类型上、顺序上必须严格一致,否则会发生“类型不匹配”的错误。当然,如果能够进行自动类型转换,或者进行了强制类型转换,那么实参类型也可以不同于形参类型。

  4. 函数调用中发生的数据传递是单向的,只能把实参的值传递给形参,而不能把形参的值反向地传递给实参;换句话说,一旦完成数据的传递,实参和形参就再也没有瓜葛了,所以,在函数调用过程中,形参的值发生改变并不会影响实参。

调用函数方式

(联系存储空间)

传值调用
long squareIt(long x) // pass by value
{
    x *=x;
    return x;
}
**传址调用 **

参数类型 指针 影响相同

long squareIt(long *x) // pass by address
{
    *x *= *x;
    return *x;
} 
引用调用
long squareIt(long &x) // pass by value
{
    x *=x;
    return x;
}

默认参数(缺省参数)

函数调用中省略实参,将把函数的缺省值赋给函数形参

缺省值的设定通常是在函数原型中给出集中在参数右边(从右往左)

匹配参数时,从左往右

int myfunc( int x, int y, int z)
int myfunc(3);//x=3;

同一函数在同一文件的不同调用函数中可以设置不同的默认值

内联函数

c++降低小程序调用开销的一种机制

将内联函数的调用以相应代码代替

inline 加在函数前

在类定义中的定义的函数都是内联函数

  • 1.在内联函数内不允许使用循环语句和开关语句;
  • 2.内联函数的定义必须出现在内联函数第一次调用之前;
  • 3.类结构中所在的类说明内部定义的函数是内联函数。

函数重载

定义函数名字相同参数类型或个数不完全相同不能采用函数返回值类型来区别重载

引用不能被认为是重载函数

函数模板

分不同类型(利用函数重载)

template<类型参数表>

返回值类型 函数名(形式参数表)

{

​ //函数体

}

模板形参三种形式

(1)typename<参数名>

(2)class<参数名>

(3)<数据类型><参数名>

c++

c++输入与输出

1.cout&cin对象

cout输出流对象 << 流插入操作符

cin输入流对象 >>流提取操作符(读取空格前的第一个非空白字符串

<< >> 分不同类型的数据

endl 换行

可以输入“一些提示语句”提升用户交互感

类型需匹配!

2.指定输入域宽(防止溢出)
char word[10];
cin>>setw(10)>>word;
cin.width(10);
cin>>word;
3.读取一行
char sentence [81];
cin.getline(sentence,81);

getline读取一整行的字符,包括空格(在一行中末尾的空格也可读取,以回车为结束标志)

4.读取一个字符
char ch;
cin>>ch;//读取第一个非空白字符
cin.get(ch);//可以读取空格
5.易错
cin.ignore();//忽略换行符!!!!

枚举类型

enum 枚举名 { 枚举元素1,枚举元素2 , ……} ;

默认情况,后续枚举成员在前面+1,从0开始;

C++的string类

头文件 string类型(和cstring不同)

cin.getline不同

cin不能读入空格 & getline(cin,name)可以

string也可以进行比较

string对象的初始化

string name(“xxx”)

string person(name)

string set1(set2,5)//用set2字符中5个对象初始化,set2字符数组

string name(fullname,0,7)//用fullname中0到7个字符初始化

“+” "+="都可以拼接

指针

指针相关

概览

一般内存单元——存放变量

指针内存单元——存放地址

内存单元的地址&内存单元内容区别

指针变量

普通变量的定义: 数据类型+变量名

存放地址的变量(指针变量)的定义:

数据类型 变量名 或 数据类型 变量名

指针应用:

先定义,并经初始化,然后再使用

定义格式:

类型说明符 *指针变量名

such as

int *pInt

char *pchar

注意:

1.指针不指向内存的0号单元。如果指针的变量值为0,则表示null,空指针。

char ch=‘A’, *pChar=&ch, *p = NULL;

2.地址值与整型数值不同。

3.何种类型的指针都占4个字节的内存空间

指针应用

取址

&:取内存变量地址

间接存取

*:通过指针间接访问所指变量

'*'含意
1.int num=16, *pInt=&num;//指针变量
2.*pInt=123;//间接存取
3.num *=123;//乘法

指针与一维数组

访问数组方式:

1.下标形式 2.指针形式

两种类型数组:

1.全局数组和静态数组:在静态储存区被创建。

2.局部数组:在栈上被创建。

数组名是一个指针常量

2.*pInt = 123;

字符串常量的值是不能被改变的

指针运算
1.指针±整数值
int m=*p1++;//将p1指向内容初始化m,再++
int n=*++p2;//将p2++,再初始化成n

求数组内元素个数

int arr[]={     };
int l=sizeof(arr)/sizeof(arr[0]);

2、3前提:两变量指向同一数组

2.指针相减

(指针相加无意义)

3.指针比较

== != < <= > >=

指针与二维数组

int a[3] [4];

行指针 :

定义:a a+1

一加加一行

元素指针(即列指针):

*a(即a[0]) *(a+1)(即a[1])

1584587114183
二维数组元素 a [i] [j] 的地址及元素表示

(1)地址:

&[i][j]       a[i]+j     *(a+i)+j

(2)元素表示:

a[i][j]    *(a[i]+j)    *(*(a+i)+j)    (*(a+i))[j]

用指针访问二维数组

1.用元素指针

2.用行指针

引用

引用符 出现在类型后面 变量名字前面

1.普通类型
int n=0;
int & r;
r=5;
cout<<n;//输出的值是5

即两者同增减

2.常引用类型,
int n;
const int & r = n; 

不能通过常引用去修改其引用内容(除非进行强制类型转换)

易混:常引用所引用的变量,其值不能被修改

常引用(修改)→变量 ×

变量(修改)→常引用 √

3.引用作为函数返回值
int n = 4;
int & Setvalue() { return n; }
int main()
{
    Setvalue()=40;//函数调用可以写在左边
    cout<<n;///输出40
    return 0; 
}
int & ri,b

内存的动态分配和释放

**new:**动态申请储存空间

delete: 释放由new申请的储存空间

需要完善

引用&指针

引用不占用存储空间 ,仅仅是个声明(共享存储空间)

指针占用储存空间

1.不能对void型建立引用

2.不能建立数组

3.不能声明引用

4.没有空引用

5.可以建立指针变量的引用

const

1.定义常量
2.定义常量指针

不可通过常量指针修改其指向内容

int n,m;
const int *p = & n;
*p = 5;//编译出错
n = 4;
p = &m;

不能把常量指针赋值给非常量指针,反过来可以

const int *p1;
int *p2;
p1 = p2;
p2 = p1;//error
p2 = (int*)p1;//强制类型转换,将p1转换成非常量指针

函数参数为常量指针时,可避免函数内部不小心改变参数指针所指地方的内容

void MyPrintf( const char *p )
{
    strcpy( p,"this");//不行,见上条
    printf("%s",p);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值