2012-03-01
1、默认参数 int test(int n,int m=4,int j=5) //从右向左添加默认值,不可跳过
2、函数重载==函数多态 定义一组名称相同的函数
(1)避免歧义 (2)int test(int n)与int test(int &n)不可共存
(3)void test(const char *bit)可接受const或非const变量
(4)特征标重载(即参数列表重载),而非函数类型重载
int test(int a,int b) long test(int a,int b)//错误 |
int test(int a,int b) int test(long a,int b) long test(int a,long b)//正确 |
3、函数模板:同一个算法,用于不同类型
template<class T>
void swap(T &a,T &b){…}
也可重载template<class T>
void swap(T *a,T*b,int n){…交换a[n]与b[n]}
2012-03-02
1 register int x;//寄存器变量,速度快,不存于内存,堆栈区,∴没有内存地址,不可引用
2
int a; static int b; func(){ static int c; int d;} main(){…} |
abc都会在程序执行期存在,d只在运行到函数时才有(c不会随函数结束而消失,d会) a:可在此文件以及本程序的其他文件中使用 b:只可在本程序本文件使用 c:只可在func()中使用 |
编译器分配固定的内存存a,b,c,整个程序期都存在
a,b,c:静态持续变量//a,外部链接性,外部变量;b,内部;c,无链接性
初始化abc时,只可用字面值常量,const,enum,size操作符
eg int x; int y=40; int z=sizeof (int )+1 //都正确
int m=2*y; //错误
见P271,extern重新声明之前定义过的,或别的文件中的外部变量
3、
//file1 int error=10; //file 2 int error=20; 错 |
//file1 int error=10; //file2 extern int error; fun(){cout<<error} 正确 |
//file1 int error=10; //file2 static int error=20; fun(){cout<<error}使用20 正确 |
4、mutable 修改const结构或类中成员
struct data{int a; mutable int b;}
则const data test={1,2};
test.a++ //错
test.b++ //对
5、函数都是静态存储连续性 ∴运行期间一直存在
默认函数是外部链接性 ∴文件见共享
但statinc int func(); 可使func只在本文件中使用
可在其他文件中定义func(),和上一个无关
6、除内联函数外,其余函数的一个程序中只能包含一个定义
总结:外部链接性函数 一处定义 多处包含原型
静态连结性函数 一处定义 一处使用(一处值一个cpp文件)
7、 char buffer[100];
int *p1=new int [10];//在内存heap中分配
int *p2=new (buffer) int [10];//在buffer中分配
//布局new操作符,指定要使用的位置,处理需要通过特定地址进行访问的硬件
此时不可delete [] p2;,∵buffer是静态内存,delete只可用于指向常规new分配的堆内存(此处为布局new,非常规new)
2012-03-03
1、命名空间可以自己定义
namespace test{ int a;
int func(int b){….}
struct student{…};
}
using 声明(更安全):eg:using test::a; using std::cin;
只导入指定名称,若与局部名称(如局部变量)冲突,将出错
using 编译 导入所有名称:eg using namespace std; using namespace test;
若冲突,局部变量会覆盖命名空间版本,不会出错
2、C++不赞成在全局作用域中使用static
static int count; int fun(){…} int main(0{…} |
建议变为 |
namespace {int count;}//未命名的命名空间,可以替代链接性为内部的静态变量 int fun(){…} int main(0{…} |
3、头文件常包含:常量,结构体定义,函数原型
//.h namespace test { strucnt person{char s[50];}; void show(const person &) } |
//1.cpp #include”1.h” namespace test {void show(const person&a) {cout<<a.name;} int b; } |
//2.cpp使用 main() { using test::person; using test::show(); } |
可以把名称加入到已有命名空间中去,如b,也可以.h声明,.cpp实现,如show()
命名空间可以嵌套 namespace a{namespace b{…}…} //using namespace a后b也被包含
4、结构默认public,类默认private
using std::cerr
if(time<0) cerr<<”An errror”; //用于错误信息
strncpy(s2,s1,n) //将s1复制n个字符到s2,若s1.length<s2,用空值填充s2
5在类声明中实现的函数自动是内联函数
如class test
{ void func(){cout<<”hello world’<<endl; }
}
也可inline void test::func(){…}//手动声明为内联函数
6类的不同对象有各自空间 但所有对象共用一组方法
test a,b; 则a,func()和b.func()调用同一个方法,执行同样的代码块
7、假设类Stock有相关的构造函数,则
Stock food=Stock(“name”,25,1.25);正确
Stock drink(“name”,25,1.25);正确
Stock *eat=new Stock(“name”,25,1.25);正确
调用默认构造函数时不用(),如Stock test;//使用默认构造函数初始化
8、const成员函数
若类对象为const类型,则不可调用普通函数
const Stock food=Stock(“name”,25,1.25);
food.show();//出错,因为show()有可能会改变food值,编译器阻止
∴使用const成员函数定义show()
void show()const 则food.show()正确
只要类方法不修改调用对象,就应该声明为const;
9、接受一个参数的构造函数允许使用赋值语法来初始化
例如某一构造函数 Stock(int a){…}
则可以Stock food(43);
Stock food=32//都正确
10要创建类对象数组,则这个类必须有默认构造函数
否则形如Stock test[10];将无法初始化
11 类声明部分只描述了对象的形式,并没有真正创建对象,无存储空间
class test{const int Length=30;} //错
class test
{
enum {Len=30;} int a[Len]
} //正确,不创建数据成员,Len只是一个符号,编译器用30替换Len
class test
{
static const int Len=30;
char a[Len];//正确,使用static 可以,但只能声明为整数或枚举的静态常量
}