C++ Primer Plus读书笔记05

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;//寄存器变量,速度快,不存于内存,堆栈区,∴没有内存地址,不可引用

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 可以,但只能声明为整数或枚举的静态常量

}

原文地址:https://www.cnblogs.com/yangtianxing/p/2435014.html