2016-06-13 68 views
0

在此site,他們給文字類的這個例子:C++ - amperand +括號數組的語法?

#include <iostream> 
#include <stdexcept> 

class conststr 
{ 
    const char* p; 
    std::size_t sz; 
public: 
    template<std::size_t N> 
    constexpr conststr(const char(&a)[N]) : p(a), sz(N - 1) {} 

    constexpr char operator[](std::size_t n) const 
    { 
     return n < sz ? p[n] : throw std::out_of_range(""); 
    } 
    constexpr std::size_t size() const { return sz; } 
}; 

constexpr std::size_t countlower(conststr s, std::size_t n = 0, 
              std::size_t c = 0) 
{ 
    return n == s.size() ? c : 
      s[n] >= 'a' && s[n] <= 'z' ? countlower(s, n + 1, c + 1) : 
             countlower(s, n + 1, c); 
} 

// output function that requires a compile-time constant, for testing 
template<int n> 
struct constN 
{ 
    constN() { std::cout << n << '\n'; } 
}; 

int main() 
{ 
    std::cout << "the number of lowercase letters in \"Hello, world!\" is "; 
    constN<countlower("Hello, world!")>(); // implicitly converted to conststr 
} 

程序導致輸出

the number of lowercase letters in "Hello, world!" is 9 

但我不明白這個程序的一個組成部分。也就是說,這條線的位置:

constexpr conststr(const char(&a)[N]) : p(a), sz(N - 1) {} 

const char(&a)[N],這是什麼語法究竟是什麼意思?它有名字嗎?

回答

1

代碼const char(&a)[N]需要括號說「a是的Nconst char秒的數組的引用

如果沒有括號,你必須const char &a[N] - 這將是」 aNconst char引用數組」,這是不允許的

這就是爲什麼我喜歡typedef S,使這些各種各樣的事情更清楚:

typedef const char ArrayN[N]; 

ArrayN &a;