C++学习笔记2
默认参数
char* left(const char* str,int n=1);//参数n的默认值为1
调用参数时:str1=left(str);//返回第一个字符组成的字符串
str2=left(str,5);//返回前五个字符组成的字符串;
函数重载(函数多态)
是指可以有多个同名的函数;仅当函数基本上执行相同的任务,但使用不同形式的数据是,才采用函数重载;
void print(const char* str,int width); //1
void print(double d,int width); //2
使用:
print("wo are family",12); //使用1
print(19.99,10); //使用2
将非const值赋给const变量是合法的,但反之是非法的;
函数模板
template<typename AnyType>
void swap(AnyType &a,AnyType &b)
{
AnyType temp;
temp=a;
a=b;
b=temp;
}
swap(2,8);
swap(2.00, 5.1);
void swap(job&, job&);//非模板函数原型
template <typename T>
void swap(T &, T &);//模板原型
template<> void swap<job>(job &, job &);//显式具体化函数原型
如果有多个原型时,编译器在选择原型时,非模板版本优先于显式具体化和模板,而显式具体化优先于使用模板生成的版本;
单独编译
(1)头文件中长包含的内容:函数原型(protortype),使用#define或const定义的符号常量,结构声明,类声明,模板声明,内联函数;
(2)如果文件名包含在<>中,则C++编译器将在存储标准头文件的主机系统的文件系统中查找;如果文件名包含在
“ ”中,则编译器将首先查找当前工作目录或源代码目录(或其他目录,取决于编译器),如果没有在哪里找到头文件,则在标准位置查找。
存储的持续性、作用域和连续性
(1)变量作用域:局部变量作用域只在定义它的代码块中(由花括号括起的一系列语句);全局变量的作用域在定义位置到文件结尾都可用;
(2)静态持续变量:
....main.cpp......文件
int global=100; //静态持续变量,可外部链接,在整个程序的执行期间都存在
static int one_file=50; //静态持续变量,内部链接,只能在本文件中使用,对别文件不可见
int main()
{
....
}
void fun_1(int n)
{
static int count=0;//静态持续,无链接,即使fun_1函数没有被执行,count也留在内存中,其值在两次函数调用期间 //保持不变;
int x=9; //x在fun_1结束后消失
........
}
静态变量默认初始化为0;
(3)单定义规则:变量只能定义一次;
定义声明(定义definition)给变量分配内存;引用声明(声明declaration)使用关键字extern,不进行初始化,不给变量分配存储空间,因为他只是引用变量;
如果在多个文件中使用外部变量,只需要在一个文件中包含该变量的定义(单定义规则),单在使用该变量的其他文件中,都必须使用关键字extern声明它;
//file_0.cpp
int cats=0;
int dogs=10;
....
//file_1.cpp
extern int cats;
extern int dogs;
.....
//file_2.cpp
extern int cats;
extern int dogs;
作用域解析运算符"::"放在变量前面,表示使用变量的全局版本;
(4)如果文件定义了一个静态外部变量,其名称与另一个文件中声明的常规外部变量相同,则在该文件中,静态变量将隐藏常规外部变量;
//file1.cpp
int global=20; //external declaration
.....
//file2.cpp
static int global=5; //known to file2 only;
void fun()
{
cout<<global; //使用文件2中的global,文件1中的被隐藏
.......
(5)使用new运算符初始化:
int *pi=new in (6); //*pi=6;
struct where{double x;double y; double z};
where* one=new where{3.2,5.3,6.5};
(6)定位new运算符,可以指定要使用的位置。
struct caff
{
char dross[2];
int flag;
};
char buffer[50];
caff* p1=new (buffer) caff; //place structure in buffer
caff* p2=new caff; //place structure in heap;
(7)在函数中声明的局部变量将隐藏在同一个文件中声明的全局变量(在名称相同时)