zoukankan      html  css  js  c++  java
  • 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 可以,但只能声明为整数或枚举的静态常量

    }

  • 相关阅读:
    哈哈,拖了一天
    内置函数续
    内置函数2
    内置函数1
    内置函数补充
    生成器面试题
    字段值为null的处理
    oracle日期转换报ORA-01810: 格式代码出现两次 01810. 00000 -  "format code appears twice"
    通过sql脚本可以从数据库中查到数据,但是通过jdbc却获取不到
    java外部捕获了异常,但是并没有打印异常和将异常信息写入日志文件
  • 原文地址:https://www.cnblogs.com/yangtianxing/p/2435014.html
Copyright © 2011-2022 走看看