1.形参列表中的形参通常用逗号隔开,其中每个形参都是含有一个声明符的声明。即使两个形参的类型一样,也必须把两个类型都写出来。
如:int f3(int v1,v2) { /*1`````````````` */} //错误
int f4(int v1,int v2) { /*1`````````````` */} //正确
2..即使某个形参不被函数使用,也必须为它提供一个实参,函数参数传递使用引用能够避免大规模拷贝.
3.自动对象:把只存在于块执行期间的对象称为自动对象。形参是一种自动对象。
局部静态对象:将局部变量定义成static类型从而获得这样的对象。局部静态变量的声明周期贯穿函数调用及之后的时间。
静态局部变量:有时希望函数中的局部变量的值在函数调用结束后不消失而保留原值,即其占用的存储单元不释放,在下一次该函数调用时,该变量保留上一次函数调用结束时的值。这时就应该指定该局部变量为静态局部变量(static local variable)。
#ifndef/#define/#endif(防止该头文件被重复引用):
#ifndef A_H意思是"if not define a.h" 如果不存在a.h
接着的语句应该#define A_H 就引入a.h
最后一句应该写#endif 否则不需要引入。
4.size_type类型的对象定义为unsigned int,unsigned long、unsigned long long的变量(6.2.2)。
5. 使用引用形参返回额外信息:
#include<iostream>
using namespace std;
string::size_type find_char(const string &s, char c, string::size_type &occurs)//‘s’作为查找范围的一个string对象;‘c’要查找的字符;用于保存字符出现次数的size_type对象。
{
auto ret = s.size();//第一次出现的位置,如果有的话
occurs = 0;//设置表示出现次数的形参值
for (decltype(ret) i = 0; i != s.size(); ++i)
{
if (s[i] == c)
{
if (ret == s.size())//ret的初始值设为字符串的长度,所以当第一次查找到要查找的字符时,执行此if语句,此时ret值为s.size(),接下来执行ret=i;
ret = i;//ret的值记录下第一次查找字符出现的位置,此时ret的值发生了改变,不再和s.size相等,所以接下来上面的这条if语句不再执行;
++occurs;//这条语句不属于上面这个if语句,而是属于外面的if语句,if语句执行的是自己下面的{}里面的,没有的话就默认是if自己下面的第一条语句;
} //所以++occurs会接着执行,只要出现要查找的字符满足外边的if语句
}
return ret;
}
int main()
{
unsigned ctr;
auto index =find_char("fffytttt", 't', ctr);
cout << ctr << index<<endl; //输出出现的次数和第一次出现的位置
system("pause");
}
6.iterator:是访问器,类似于指针,具有指针相似的功能,访问器最重要的是给所有容器提供了一个通用的访问方法。Iterator是模板类。
#include<iostream>
using namespace std;
string::size_type find_char(const string &s, char c, string::size_type &occurs)//‘s’作为查找范围的一个string对象;‘c’要查找的字符;用于保存字符出现次数的size_type对象。
{
auto ret = s.size();//第一次出现的位置,如果有的话
occurs = 0;//设置表示出现次数的形参值
for (decltype(ret) i = 0; i != s.size(); ++i)
{
if (s[i] == c)
{
if (ret == s.size())//ret的初始值设为字符串的长度,所以当第一次查找到要查找的字符时,执行此if语句,此时ret值为s.size(),接下来执行ret=i;
ret = i;//ret的值记录下第一次查找字符出现的位置,此时ret的值发生了改变,不再和s.size相等,所以接下来上面的这条if语句不再执行;
++occurs;//这条语句不属于上面这个if语句,而是属于外面的if语句,if语句执行的是自己下面的{}里面的,没有的话就默认是if自己下面的第一条语句;
} //所以++occurs会接着执行,只要出现要查找的字符满足外边的if语句
}
return ret;
}
int main()
{
unsigned ctr;
auto index =find_char("fffytttt", 't', ctr);
cout << ctr << index<<endl; //输出出现的次数和第一次出现的位置
system("pause");
}
verctor<int> v,就是创建了一个名字叫v的向量容器。
vector<int>::iterator是定义向量迭代器
例如,vector<int>::iterator it
就可以for(it=v.begin();it!=v.end();it++)
cout<<*it<<endl;就把里面的内容都输出了 7.数组形参: void print(const int*); void print(const int[ ]); void print(const int[10]);这三个print函数是等价的,每个函数有一个const int*类型的参数;
int i=0,j[2]={0,1};
print(&i);//&i的类型是int*
print(j);//j转换成int*并指向j[0]
8.#include<iostream>
using namespace std;
void SwapPointer1(int *p, int *q)//函数以值传递的方式使用指针,所有改变都局限于函数内部,当函数执行完毕后既不会改变指针本身的值,也不会改变指针所指的内容。
{
int *temp = p;
p = q;
q = temp;
}
void SwapPointer2(int *p, int *q)//函数以值传递的方式使用指针,但是在函数内部通过解引用的方式直接访问内存并修改了指针所指的内容。
{
int temp = *p;
*p = *q;
*q = temp;
}
void SwapPointer3(int *&p, int *&q)//函数的参数形式是int *&,其含义是,该参数是一个引用,引用的对象是内存中的一个int指针,指针本身和指针所指的内容都被改变。
{
int *temp = p;
p = q;
q = temp;
}
int main()
{
int a = 5, b = 10;
int *p = &a, *q = &b;
cout << "交换前:" << endl;
cout << "P的值是:" << p << ",q的值是:" << q << endl;
cout << "p所指的值是:" << *p << ",q所指的值是:" << *q << endl;
SwapPointer1(p, q);
cout << "交换后:" << endl;
cout << "P的值是:" << p << ",q的值是:" << q << endl;
cout << "p所指的值是:" << *p << ",q所指的值是:" << *q << endl;
a = 5, b = 10;
p = &a, q = &b;
SwapPointer2(p, q);
cout << "交换后:" << endl;
cout << "P的值是:" << p << ",q的值是:" << q << endl;
cout << "p所指的值是:" << *p << ",q所指的值是:" << *q << endl;
a = 5, b = 10;
p = &a, q = &b;
SwapPointer3(p, q);
cout << "交换后:" << endl;
cout << "P的值是:" << p << ",q的值是:" << q << endl;
cout << "p所指的值是:" << *p << ",q所指的值是:" << *q << endl;
}
#include<iostream>
using namespace std;
void SwapPointer1(int *p, int *q)//函数以值传递的方式使用指针,所有改变都局限于函数内部,当函数执行完毕后既不会改变指针本身的值,也不会改变指针所指的内容。
{
int *temp = p;
p = q;
q = temp;
}
void SwapPointer2(int *p, int *q)//函数以值传递的方式使用指针,但是在函数内部通过解引用的方式直接访问内存并修改了指针所指的内容。
{
int temp = *p;
*p = *q;
*q = temp;
}
void SwapPointer3(int *&p, int *&q)//函数的参数形式是int *&,其含义是,该参数是一个引用,引用的对象是内存中的一个int指针,指针本身和指针所指的内容都被改变。
{
int *temp = p;
p = q;
q = temp;
}
int main()
{
int a = 5, b = 10;
int *p = &a, *q = &b;
cout << "交换前:" << endl;
cout << "P的值是:" << p << ",q的值是:" << q << endl;
cout << "p所指的值是:" << *p << ",q所指的值是:" << *q << endl;
SwapPointer1(p, q);
cout << "交换后:" << endl;
cout << "P的值是:" << p << ",q的值是:" << q << endl;
cout << "p所指的值是:" << *p << ",q所指的值是:" << *q << endl;
a = 5, b = 10;
p = &a, q = &b;
SwapPointer2(p, q);
cout << "交换后:" << endl;
cout << "P的值是:" << p << ",q的值是:" << q << endl;
cout << "p所指的值是:" << *p << ",q所指的值是:" << *q << endl;
a = 5, b = 10;
p = &a, q = &b;
SwapPointer3(p, q);
cout << "交换后:" << endl;
cout << "P的值是:" << p << ",q的值是:" << q << endl;
cout << "p所指的值是:" << *p << ",q所指的值是:" << *q << endl;
}
9.#include <iostream> #include<string> using namespace std; int main(int argc, char** argv) //前者可接受 命令行参数,argc表示参数个数, argv[]是参数数组,其中第0个参数是程序本身的名称(包含路径)。
//argv[]是一个字符数组.argv[0]:指向程序的全路径名argv[1]:指向在DOS命令行中执行程序名后的第一个字符串。argv[2]:指向第二个字符串。 { string str; for (int i = 0; i != argc; i++) str += argv[i]; cout << str << endl; cout << argc << endl; system("pause"); return 0; }结果图如下:
10.initializer_list<int>:为了编写能够处理不同数量实参(但是类型相同),C++11新标准提供了initializer_list的方法。与vector不同的是,initializer_list对象中的元素永远是常量值,我们无法改变initializer_list对象中元素的值。是C++标准程序库中的一个头文件,定义了C++标准中一个非常轻量级的表示初始化器列表的类模板initializer_list及有关函数。知识小点:
1.const int temp1=10;
int temp2=10;
const int *p=&temp1;//指向整形常量的指针
p=&j;//对
*p=10;//错
int *const q=&temp2;//指向整形的常量指针
q=&j;//错
*q=11;//对
2.函数定义包括:返回类型、函数名字、形参列表、函数体。
3.函数的调用完成两项工作:一是用实参初始化函数对应的形参,二是将控制权转移给被调用函数;
return语句完成两项工作:一是返回return语句中的值,二是将控制权从被调函数转移回给主调函数。
3.函数的返回类型不能是数组类型或函数类型,但可以使指向数组或函数的指针。
4.static局部静态变量。
5.分离式编译:把程序分割到几个文件中去,每个文件独立编译。
6.参数传递:形参的类型决定了形参和实参交互的方式。
如果形参是引用类型,它将绑定到对应的实参上;否则,将实参的值拷贝给形参。
引用传递 (值传递); 传引用调用(传值调用)(形参是引用类型)
使用引用形参返回额外的信息:定义一个find_char的函数,它返回string对象中某个指定字符第一次出现的位置,同时返回该字符出现的总次数。
7.引用形参的引用传递的优势:
(1)可以直接操作引用形参所引用的对象;
(2)使用引用形参可以避免拷贝大的类类型对象或容器类型对象;
(3)使用引用形参可以帮助我们从函数中返回多个值,
8.const形参和实参:指针或引用形参与const
reset(&i);//调用形参类型是int*的reset函数;
reset(i);//调用形参类型是int&的reset函数
9.数组形参:int i=0,j[2]={0,1};
print(&i);//&i的类型是int*;
print(j;//j转换成int*并指向j[0];
(1)使用标记指定数组长度:空字符
(2)使用标准库规范 begin end
(3)显示传递一个表示数组大小的形参
10.地柜:如果一个函数调用了它自身,不管这种调用是直接的还是间接的,都称该函数为递归函数;
11.返回数组指针:
int arr[10];//arr是一个含有10个整数的数组;
int *p1[10];//p1是一个含有10个指针的数组;
int (*p2)[10]=&arr;//p2是一个指针,它指向含有10个整数的数组;
12.特殊用途语言:默认参数、内联函数、constexpr函数
13.调试帮助:assert预处理宏;NDEBUG预处理变量;
const int ci=42;//不能改变ci,const是顶层的;
int *const p=&i;//指向整形的常量指针
const int *p=&i;//指向整形常量的指针