• [C++ Primer Plus] 第9章、内存模型和名称空间(一)程序清单


    程序清单9.9(静态存储连续性、无链接性)

    #include<iostream>
    using namespace std;
    
    const int Size=10;
    void strcount(const char *str){//const表示str指针不能修改指向的内容(不过可以指向另外一块内容)
        static int total=0;//static静态变量,首次初始化后,其值一直存在(即第二次调用strcount函数时,total的值不会再次初始化)
        int count=0;
        cout<<"""<<str<<"" contains ";
        while (*str++)//先判断*str是否为NULL,然后再str++
            count++;
        total+=count;
        cout<<count<<" characters
    ";
        cout<<total<<" characters total!
    ";
    }
    
    void main() {
        char in[Size];
        char next;
        cout<<"Enter a line:"<<endl;
        cin.get(in,Size);//最多接收Size-1个字符+1个''
        while (cin)    // ==while(!cin.fail()),即读入流成功 
        {
            cin.get(next);
            while(next!='
    ')    //若next不是换行符
                cin.get(next);
            strcount(in);
            cout<<"Enter next line (empty line to quit):
    ";
            cin.get(in,Size);
        }
        cout<<"Bye!"<<endl;
        system("pause");
    }

    程序清单9.10(常规new和定位new运算符)

     1 #include<iostream>
     2 #include<new>    //定位new运算符
     3 using namespace std;
     4 
     5 const int BUF=512;
     6 const int N=5;
     7 char buff[BUF];
     8 
     9 void main() {
    10     double *p1,*p2;
    11     int i;
    12     cout<<"Calling"<<endl;
    13     p1=new double[N];//常规new:p1是double指针
    14     p2=new (buff) double[N];//定位new运算符:将数组p2放在了数组buff中
    15     for (i = 0; i < N; i++)
    16         p2[i]=p1[i]=1000+20.0*i;
    17     cout<<"Memory addresses:"<<endl<<" heap: "<<p1<<" static: "<<(void *)buff<<endl;//buffer是char指针,所以要使用(void *)对buffer进行强转,否则将显示字符串
    18     cout<<"Memory contents:"<<endl;
    19     for (i = 0; i < N; i++)
    20     {
    21         cout<<p1[i]<<" at "<<&p1[i]<<";";
    22         cout<<p2[i]<<" at "<<&p2[i]<<endl;
    23     }
    24 
    25     cout<<"
    Calling new"<<endl;
    26     double *p3,*p4;
    27     p3=new double[N];
    28     p4=new (buff) double[N];
    29     for (i = 0; i < N; i++)
    30         p4[i]=p3[i]=1000+40.0*i;
    31     cout<<"Memory contents:"<<endl;
    32     for (i = 0; i < N; i++)
    33     {
    34         cout<<p3[i]<<" at "<<&p3[i]<<";";
    35         cout<<p4[i]<<" at "<<&p4[i]<<endl;
    36     }
    37 
    38     cout<<"
    Calling new third"<<endl;
    39     delete [] p1;
    40     p1=new double [N];
    41     p2=new (buff+N*sizeof(double)) double[N];
    42     for (i = 0; i < N; i++)
    43         p2[i]=p1[i]=1000+60.0*i;
    44     cout<<"Memory contents:"<<endl;
    45     for (i = 0; i < N; i++)
    46     {
    47         cout<<p1[i]<<" at "<<&p1[i]<<";";
    48         cout<<p2[i]<<" at "<<&p2[i]<<endl;
    49     }
    50     //buff指定的内存是静态内存,所以不能delete
    51     delete [] p1;
    52     delete [] p3;
    53 
    54     system("pause");
    55 }

    程序清单9.11-13(名称空间示例)

    namesp.h  头文件

    #include<string>
    namespace pers{        //包含Person结构的定义和两个函数原型
        struct Person{
            std::string fname;
            std::string lname;
        };
        void getPerson(Person &);//引用
        void showPerson(const Person &);
    }
    
    namespace debts{    //定义Debt结构,用于存储人名和金额,使用using编译指令,让pers中的名称在debts空间也能使用
        using namespace pers;
        struct Debt{
            Person name;
            double amount;
        };
        void getDebt(Debt &);
        void showDebt(const Debt &);
        double sumDebts(const Debt ar[],int n);
    }

    namesp.cpp  函数定义

    #include<iostream>
    #include<string>
    #include "namesp.h"//自己编写的头文件只能使用引号"",系统自带的头文件使用<>,不过""也能用
    
    namespace pers{
        using std::cout;
        using std::cin;
        void getPerson(Person &rp){
            cout<<"Enter first name:";
            cin>>rp.fname;
            cout<<"Enter last name:";
            cin>>rp.lname;
        }
        void showPerson(const Person &rp){
            cout<<rp.lname<<","<<rp.fname;
        }
    }
    
    namespace debts{
        void getDebt(Debt &rd){
            getPerson(rd.name);
            std::cout<<"Enter debt:";
            std::cin>>rd.amount;
        }
        void showDebt(const Debt &rd){
            showPerson(rd.name);
            std::cout<<": $"<<rd.amount<<std::endl;
        }
        double sumDebts(const Debt ar[],int n){
            double total=0;
            for (int i = 0; i < n; i++)
                total+=ar[i].amount;
            return total;
        }
    }

    main.cpp  主函数

    #include<iostream>
    #include "namesp.h"
    using std::cout;
    using std::endl;
    
    void other(){
        using namespace debts;
        Person dg={"Doodles","Glister"};
        showPerson(dg);
        cout<<endl;//因为showPerson没有换行
        Debt zippy[3];
        int i;
        for (i = 0; i < 3; i++)
            getDebt(zippy[i]);
        for (i = 0; i < 3; i++)
            showDebt(zippy[i]);
        cout<<"Total debt: $"<<sumDebts(zippy,3)<<endl;
    }
    
    void another(){
        using pers::Person;
        Person collector={"Milo","Rightshift"};
        pers::showPerson(collector);
        cout<<endl;
    }
    
    void main(){
        using debts::Debt;
        using debts::showDebt;
        Debt golf={{"Benny","Goatsniff"},120.0};
        showDebt(golf);
        other();
        another();
        system("pause");
    }

  • 相关阅读:
    二层设备与三层设备的区别--总结
    转载-vim配置收藏
    Docker入门
    Docker入门
    Docker入门
    Docker入门
    Docker入门
    树莓派进阶之路 (037)
    基于Centos搭建个人 Leanote 云笔记本
    基于CentOS搭建私有云服务
  • 原文地址:https://www.cnblogs.com/little-monkey/p/7631971.html
Copyright © 2020-2023  润新知