2011-01-07 4 views
0

저는 C++을 처음 사용합니다.변수가 C++에서 함수 호출처럼 정의 될 수 있습니다.

C++ 자료를 살펴 보았을 때 C++의 변수를 함수 호출과 비슷하게 정의 할 수 있다는 것을 알았습니다.

int var = 10; //explicit assignment 

은 동일하다

int var(10); //implicit assignment 
암시 적 과제는 함수 호출과 매우 유사 할지라도

", 컴파일러는 계속 이름은 변수와 함수있는 트랙 어느 있도록 그들은 제대로 해결 될 수 있습니다. " Link

프로그래머를 혼란스럽게하지 않습니까? 왜 그런 기능이 C++에 존재합니까? 내가 알아야하는 C++의 비슷한 혼란스러운 기능은 무엇입니까?

+1

두 번째 양식을 사용하여 잡은 사람은 누구나 자루에 넣어집니다! –

+0

MarkB가 말하듯이 함수 호출이기 때문에 함수 호출과 비슷해 보입니다. 호출되는 함수는 생성자입니다. 적어도 하나의 인수를 전달해야하며'T()'형식의 단일 인수가 될 수 없다는 점에 유의하십시오.이 인수는 다른 컨텍스트에서 기본 변수를 구성합니다. 이 규칙을 따르지 않으면 로컬 범위에서 함수 프로토 타입 (즉, 전달 선언)을 얻을 수 있습니다. 이는 프로그래머를 정말로 혼란스럽게합니다. –

+1

잡힌 사람 ** 생성자의 초기화 목록에서 두 번째 형식을 사용하지 않음 **은 자루에 넣습니다 ... -_- '' – davogotland

답변

1

실제로는 함수 호출보다 생성자 호출과 비슷해 보이지만, 이는 객체의 생성 중에 클래스 멤버에게 값이 주어질 때 유용합니다. 제가 예를 들어주게 :

#include <iostream> 

class Cool 
{ 
    public: 
     Cool(std::string someString, bool isCool); 
     ~Cool(); 
     std::string getSomeString() const; 
     bool isCool() const; 
    private: 
     std::string m_someString; 
     bool m_isCool; 
}; 

Cool::Cool(std::string someString, bool isCool) : 
     m_someString(someString), 
     m_isCool(isCool) 
{ 
    std::cout << "constructor of Cool, members are set in initialization list\n"; 
} 

Cool::~Cool() 
{ 
    std::cout << "destructor of Cool\n"; 
} 

std::string Cool::getSomeString() const 
{ 
    return m_someString; 
} 

bool Cool::isCool() const 
{ 
    return m_isCool; 
} 

int main(int argc, char* argv[]) 
{ 
    Cool stuff("is cool", true); 

    if(stuff.isCool()) 
    { 
     std::cout << stuff.getSomeString(); 
    } 

    return 0; 
} 

이 기능은 (클래스, 구조체 또는 노동 조합에 선언) 기본 유형과 자신의 종류의 차이 덜 ... 다른 만드는을,

기억) 초기화 목록이 상속 목록에서 선언 된 것과 동일한 순서로 슈퍼 생성자를 먼저 선언해야하며 멤버는 비공개로 선언 된 동일한 순서로 선언해야합니다. 예, 모든 멤버는 항상 비공개로 선언됩니다!

클래스의 메서드 이름 뒤에 지정된 키워드 const는이 메서드가 개체의 멤버를 변경하지 않을 것을 의미합니다. 이 두 메서드 중 하나라도 멤버 중 하나에 할당하면 컴파일 오류가 발생합니다. 이것은 프로그래머가 코드에서 어리석은 실수를해서는 안되며 컴파일러가 생성 된 바이너리 코드에서 멋진 빠른 것을 만들 수 있도록 실행 속도를 높입니다.

이 놀라운 언어의 특징에 대한 자세한 내용은 scott meyers의 320 페이지 짧은 책 "효과적인 C++ : 프로그램 및 디자인 개선을위한 55 가지 구체적인 방법"을 참조하십시오. 제 3 판을 읽고 있는지 확인하십시오 d (^ - ^) b

3

개체의 생성자를 호출하는 것과 같은 구문이므로 템플릿이있는 기본 형식을 사용할 수 있습니다.

// Not useful, but for example: 
class Foo 
{ 
public: 
    explicit Foo(int num) { } 
    // ... 
}; 

template <class T> 
int bar() 
{ 
    T item(5); 
} 

int main() 
{ 
    bar<int>(); 
    bar<Foo>(); 
    return 0; 
} 
+0

+1 : 영리한 예. –

관련 문제