TIL该变量可以像C ++中的函数调用一样定义

时间:2011-01-07 04:59:40

标签: c++

我是C ++的新手。

当我浏览C ++材料时,我发现C ++中的变量可以像函数调用一样定义。

即。

int var = 10; //explicit assignment

相同
int var(10); //implicit assignment

“即使隐式赋值看起来很像函数调用,编译器会跟踪哪些名称是变量,哪些是函数,以便可以正确解析它们。”Link

难道不会让程序员迷惑吗?为什么C ++中会出现这样的功能! 我应该注意哪些类似C ++的令人困惑的特性?

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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;
}

这个特性使原始类型和你自己的类型(在类,结构或联合中声明)之间的区别更少......不同;)

请记住,初始化列表应该首先声明超级构造函数,其顺序与它们在继承列表中声明的顺序相同,然后是成员,它们在private下声明的顺序相同。是的,所有成员总是在私下宣布!

在类中的方法名称之后指定的关键字const表示此方法承诺不更改对象中的任何成员。如果这两个方法中的任何一个将分配给任何成员,则会出现编译错误。这有助于程序员不会在代码中犯下愚蠢的错误,并且它还可以加快执行速度,因为这可以让编译器在生成的二进制代码中做出一些快速的事情。

有关这种惊人语言的怪癖的更多信息,请阅读scott meyers的320页短篇小说“有效的c ++:55种改进程序和设计的具体方法”。确保你正在阅读第3版d(^ - ^)b