2016-06-13 8 views
0

Auf dieser site, geben sie dieses Beispiel einer wörtlichen Klasse:C++ - Amperand + Klammern Array-Syntax?

#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 
} 

Die Programmergebnisse in der Ausgabe

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

Aber ich verstehe nicht, ein Teil dieses Programms. Das heißt, diese Zeile hier:

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

const char(&a)[N], was bedeutet diese Syntax genau bedeuten? Hat es einen Namen?

Antwort

1

Der Code const char(&a)[N] Bedürfnisse Klammern zu sagen: „a ist eine Referenz auf ein Array von Nconst char s

Ohne die Klammern Sie const char &a[N] haben würde -. Das wäre“ a ist ein Array von Nconst char Referenzen “, was nicht erlaubt ist

Deshalb habe ich typedef s bevorzugen, um diese Art von Dingen klarer zu machen.

typedef const char ArrayN[N]; 

ArrayN &a; 
Verwandte Themen