我是C ++的新手。
当我浏览C ++材料时,我发现C ++中的变量可以像函数调用一样定义。
即。
int var = 10; //explicit assignment
与
相同int var(10); //implicit assignment
“即使隐式赋值看起来很像函数调用,编译器会跟踪哪些名称是变量,哪些是函数,以便可以正确解析它们。”Link
难道不会让程序员迷惑吗?为什么C ++中会出现这样的功能! 我应该注意哪些类似C ++的令人困惑的特性?
答案 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