C++ Primer 学习笔记 第十八章 用于大型程序的工具

18.5

#include <iostream>
#include <vector>
#include <string>
#include <list>
#include <iterator>
#include <memory>
#include <fstream>
#include <algorithm>
#include <functional>
#include <map>
#include <set>
#include <sstream>
#include <bitset>
#include <regex>
#include <random>
#include <ctime>
#include <iomanip>
using namespace std;


int main(){
    try{
        int a = 1;
        throw range_error("abc");
    }
    catch (range_error r){
        cout << r.what();
    }
    return 0;
}

689 在构造函数捕获异常

#include <iostream>
#include <vector>
#include <string>
#include <list>
#include <iterator>
#include <memory>
#include <fstream>
#include <algorithm>
#include <functional>
#include <map>
#include <set>
#include <sstream>
#include <bitset>
#include <regex>
#include <random>
#include <ctime>
#include <iomanip>
using namespace std;

template <typename T> class Blob{
public:
    typedef T value_type;
    typedef typename vector<T>::size_type size_type;
    Blob()=default;
    Blob(initializer_list<T> il);
    size_type size() const {return data->size();}
    bool empty() const {return data->empty();}
    void push_back(const T &t){data->push_back(t);}
    void pop_back(){}
    T& back(){}
    T& operator[](size_type i){}
private:
    shared_ptr<vector<T>> data;
    void check(size_type i,const string &msg) const{}

};

template <typename T>
Blob<T>::Blob(initializer_list<T> il) try:data(make_shared<vector<T>>(il)){


} catch (const std::bad_alloc &e) {

}


int main(){
    return 0;
}

691 noexcept承诺不抛出异常

#include <iostream>
#include <vector>
#include <string>
#include <list>
#include <iterator>
#include <memory>
#include <fstream>
#include <algorithm>
#include <functional>
#include <map>
#include <set>
#include <sstream>
#include <bitset>
#include <regex>
#include <random>
#include <ctime>
#include <iomanip>
#include <exception>
using namespace std;

void f() noexcept{
    throw exception();
    
}


int main(){
    return 0;

}

691 noexcept运算符

#include <iostream>
#include <vector>
#include <string>
#include <list>
#include <iterator>
#include <memory>
#include <fstream>
#include <algorithm>
#include <functional>
#include <map>
#include <set>
#include <sstream>
#include <bitset>
#include <regex>
#include <random>
#include <ctime>
#include <iomanip>
#include <exception>
using namespace std;

void g() noexcept{
    
}

// g函数如果承诺不抛出异常,那么f函数也不抛出异常
void f() noexcept(noexcept(g())){
    

}


int main(){
    return 0;

}

指向noexcept函数的指针也必须是noexcept的

#include <iostream>
#include <vector>
#include <string>
#include <list>
#include <iterator>
#include <memory>
#include <fstream>
#include <algorithm>
#include <functional>
#include <map>
#include <set>
#include <sstream>
#include <bitset>
#include <regex>
#include <random>
#include <ctime>
#include <iomanip>
#include <exception>
using namespace std;


int func(int a) noexcept{
    return 0;
}

int main(){
    int (*pf1)(int) noexcept = func;
    return 0;

}

695 定义并使用命名空间

定义命名空间
Sales_data.h

//
// Created by ethan on 2022/3/12.
//

namespace cplusplus_primer{
    class Sales_data{};
    Sales_data operator+(const Sales_data&, const Sales_data&);
    class Query{};
    class Query_base{};
}

使用命名空间
main.cpp

#include <iostream>
#include <vector>
#include <string>
#include <list>
#include <iterator>
#include <memory>
#include <fstream>
#include <algorithm>
#include <functional>
#include <map>
#include <set>
#include <sstream>
#include <bitset>
#include <regex>
#include <random>
#include <ctime>
#include <iomanip>
#include <exception>
#include "sales_data.h"
using namespace std;
using namespace cplusplus_primer;


int main(){

    cplusplus_primer::Sales_data data;
    return 0;

}

698 在外部定义命名空间

sales_data.h

#include <string>

namespace cplusplus_primer{
    class Sales_data{};
    Sales_data operator+(const Sales_data&, const Sales_data&);

}

sales_data.cc

#include "sales_data.h"

namespace cplusplus_primer{
    std::istream& operator>>(std::istream& in, Sales_data& s){
        return in;
    }
}

cplusplus_primer::Sales_data
cplusplus_primer::operator+(const Sales_data &, const Sales_data &) {
    return Sales_data&;
}

699 命名空间的嵌套

sales_data.h

//
// Created by ethan on 2022/3/12.
//

#include <string>

namespace cplusplus_primer{
    namespace QueryLib{
        class Query{};
        Query operator&(const Query&, const Query&);
    }
    namespace Bookstore{
        class Quote{};
        class Disc_quote:public Quote{};
    }

}

main.cpp

#include <iostream>
#include <vector>
#include <string>
#include <list>
#include <iterator>
#include <memory>
#include <fstream>
#include <algorithm>
#include <functional>
#include <map>
#include <set>
#include <sstream>
#include <bitset>
#include <regex>
#include <random>
#include <ctime>
#include <iomanip>
#include <exception>
#include "sales_data.h"
using namespace std;
using namespace cplusplus_primer;


int main(){

    cplusplus_primer::QueryLib::Query q;
    return 0;

}

700 内联命名空间可以不用逐级去访问

sales_data.h

//
// Created by ethan on 2022/3/12.
//

#include <string>

inline namespace FifthEd{}

namespace cplusplus_primer{
    inline namespace FifthEd{
        class Query_base{};
    }
}

main.cpp

#include <iostream>
#include <vector>
#include <string>
#include <list>
#include <iterator>
#include <memory>
#include <fstream>
#include <algorithm>
#include <functional>
#include <map>
#include <set>
#include <sstream>
#include <bitset>
#include <regex>
#include <random>
#include <ctime>
#include <iomanip>
#include <exception>
#include "sales_data.h"
using namespace std;
using namespace cplusplus_primer;


int main(){

    cplusplus_primer::Query_base q;
    return 0;

}

701 未命名的命名空间权限很高,可以通过最外层命名空间直接访问,有点像inline

#include <iostream>
#include <vector>
#include <string>
#include <list>
#include <iterator>
#include <memory>
#include <fstream>
#include <algorithm>
#include <functional>
#include <map>
#include <set>
#include <sstream>
#include <bitset>
#include <regex>
#include <random>
#include <ctime>
#include <iomanip>
#include <exception>
using namespace std;

namespace local{
    namespace  {
        int i;
    }
}


int main(){
    local::i=42;
    return 0;

}

702 为命名空间起一个别名

#include <iostream>
#include <vector>
#include <string>
#include <list>
#include <iterator>
#include <memory>
#include <fstream>
#include <algorithm>
#include <functional>
#include <map>
#include <set>
#include <sstream>
#include <bitset>
#include <regex>
#include <random>
#include <ctime>
#include <iomanip>
#include <exception>


namespace cplusplus_primer{
    int i;
}

// primer等同于cplusplus_primer
namespace primer = cplusplus_primer;


int main(){
    primer::i;
    return 0;

}

703 using指示和作用域

#include <iostream>
#include <vector>
#include <string>
#include <list>
#include <iterator>
#include <memory>
#include <fstream>
#include <algorithm>
#include <functional>
#include <map>
#include <set>
#include <sstream>
#include <bitset>
#include <regex>
#include <random>
#include <ctime>
#include <iomanip>
#include <exception>
using namespace std;


namespace A{
    int i=3, j=2;
}

using namespace A;

int main(){

    cout << i*j << endl; //6
    return 0;

}

703 using冲突的示例

#include <iostream>
#include <vector>
#include <string>
#include <list>
#include <iterator>
#include <memory>
#include <fstream>
#include <algorithm>
#include <functional>
#include <map>
#include <set>
#include <sstream>
#include <bitset>
#include <regex>
#include <random>
#include <ctime>
#include <iomanip>
#include <exception>
using namespace std;


namespace blip{
    int i = 16, j = 15, k = 23;
}

int j = 0;

int main(){
    using namespace blip;
    ++ i;
    // ++ j; // ambiguous
    ++ ::j;
    cout << ::j << endl; // 1
    ++blip::j;
    cout << k <<endl; // 23
    // overlap blip::j
    int k = 20; 
    cout << k << endl; // 20
    return 0;

}

友元声明与实参查找

#include <iostream>
#include <vector>
#include <string>
#include <list>
#include <iterator>
#include <memory>
#include <fstream>
#include <algorithm>
#include <functional>
#include <map>
#include <set>
#include <sstream>
#include <bitset>
#include <regex>
#include <random>
#include <ctime>
#include <iomanip>
#include <exception>
using namespace std;


namespace A{
    class C{
        friend void f2();
        friend void f(const C&);

    };
}



int main(){
    A::C obj;
    //
    f(obj);
//    f2();
    return 0;

}

18.18

#include <iostream>
#include <vector>
#include <string>
#include <list>
#include <iterator>
#include <memory>
#include <fstream>
#include <algorithm>
#include <functional>
#include <map>
#include <set>
#include <sstream>
#include <bitset>
#include <regex>
#include <random>
#include <ctime>
#include <iomanip>
#include <exception>
using namespace std;

template<typename T>
void swap(T v1, T v2){
    using std::swap;
    cout <<"use custom"<< endl;
    swap(v1.mem1, v2.mem1);
}

class Book{
public:
    Book(string s):mem1(s){};
    string mem1;
};


int main(){

    Book b1("conan");
    Book b2("jide");

    std::swap(b1.mem1, b2.mem1);
    cout << b2.mem1 << endl;

    ::swap(b1, b2);
    cout << b2.mem1 << endl;

    return 0;

}

708 继承相关命名空间的查找

#include <iostream>
#include <vector>
#include <string>
#include <list>
#include <iterator>
#include <memory>
#include <fstream>
#include <algorithm>
#include <functional>
#include <map>
#include <set>
#include <sstream>
#include <bitset>
#include <regex>
#include <random>
#include <ctime>
#include <iomanip>
#include <exception>
using namespace std;

namespace NS{
    class Quote{};
    void display(const Quote&){}
}

class Bulk_item: public NS::Quote{

};

int main(){
    Bulk_item book1;
    // 调用基类所属命名空间中的函数
    display(book1);
    return 0;

}

709 重载与using指示

#include <iostream>
#include <vector>
#include <string>
#include <list>
#include <iterator>
#include <memory>
#include <fstream>
#include <algorithm>
#include <functional>
#include <map>
#include <set>
#include <sstream>
#include <bitset>
#include <regex>
#include <random>
#include <ctime>
#include <iomanip>
#include <exception>
using namespace std;

namespace libs_R_us{
    extern void print(int){cout << "int" << endl;};
    extern void print(double){cout << "double" << endl;};
}

void print(const std::string &){cout << "string" << endl;};

using namespace libs_R_us;

int main(){

    print("adfadf");
    print(42);
    return 0;

}

709 重载函数跨越多个using

#include <iostream>
#include <vector>
#include <string>
#include <list>
#include <iterator>
#include <memory>
#include <fstream>
#include <algorithm>
#include <functional>
#include <map>
#include <set>
#include <sstream>
#include <bitset>
#include <regex>
#include <random>
#include <ctime>
#include <iomanip>
#include <exception>
using namespace std;


namespace AW{
    void print(int){
        cout<< "int" << endl;
    }
}
namespace Primer{
    void print(double){
        cout << "double" << endl;
    }
}


int main(){
    using namespace AW;
    using namespace Primer;

    print(43);
    print(3.2);

    return 0;

}

18.20

#include <iostream>
#include <vector>
#include <string>
#include <list>
#include <iterator>
#include <memory>
#include <fstream>
#include <algorithm>
#include <functional>
#include <map>
#include <set>
#include <sstream>
#include <bitset>
#include <regex>
#include <random>
#include <ctime>
#include <iomanip>
#include <exception>
using namespace std;


namespace primerLib{
    void compute(){cout << "void" << endl;};
    void compute(const void *){cout << "const void *" << endl;};
}
using primerLib::compute;
void compute(int){cout << "int" << endl;};
void compute(double, double = 3.14){cout << "double" << endl;};
void compute(char*, char* =0){cout << "char *" << endl;};



int main(){
    using primerLib::compute; // void compute(const void *)
    compute(0);
    return 0;

}

712 继承的基类中如果含有相同的构造函数那么派生类必须指定构造函数

#include <iostream>
#include <vector>
#include <string>
#include <list>
#include <iterator>
#include <memory>
#include <fstream>
#include <algorithm>
#include <functional>
#include <map>
#include <set>
#include <sstream>
#include <bitset>
#include <regex>
#include <random>
#include <ctime>
#include <iomanip>
#include <exception>
using namespace std;


struct Base1{
    Base1() = default;
    Base1(const std::string&);
    Base1(std::shared_ptr<int>);
};

struct Base2{
    Base2()=default;
    Base2(const std::string&);
    Base2(int);
};

struct D1:public Base1, public Base2{
    using Base1::Base1;
    using Base2::Base2;
    // necessary
    D1(const string &s):Base1(s),Base2(s){}
    D1()=default;
};


int main(){
    return 0;

}

716 继承基类中有同名方法的解决办法,使用using

#include <iostream>
#include <vector>
#include <string>
#include <list>
#include <iterator>
#include <memory>
#include <fstream>
#include <algorithm>
#include <functional>
#include <map>
#include <set>
#include <sstream>
#include <bitset>
#include <regex>
#include <random>
#include <ctime>
#include <iomanip>
#include <exception>
using namespace std;


class Base1{
public:
    void print(){
        cout << "base1" << endl;
    }
};

class Base2{
public:
    void print(){
        cout << "base2" << endl;
    }
};

class Sub:public Base1, public Base2{
public:
    using Base1::print;
};


int main(int argc,char** argv){

    Sub s;
    s.print();
    return 0;
}

718 使用虚类

#include <iostream>
#include <vector>
#include <string>
#include <list>
#include <iterator>
#include <memory>
#include <fstream>
#include <algorithm>
#include <functional>
#include <map>
#include <set>
#include <sstream>
#include <bitset>
#include <regex>
#include <random>
#include <ctime>
#include <iomanip>
#include <exception>
using namespace std;

class ZooAnimal{};
class Endanger{};


class Raccon:public virtual ZooAnimal{};
class Bear:virtual public ZooAnimal{};

// 由于虚类测存在,这里只有一个ZooAnimal
class Panda:public Bear, public Raccon, public Endanger{};






int main(int argc,char** argv){

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值