当编译器编译一个正常的成员函数时,它隐式地添加一个新的参数到函数名为“这个”。this指针是一个隐藏的const指针保存的对象的成员函数的地址被。
还有一个更详细的照顾。在成员函数中,任何类成员(函数和变量)也需要被更新,所以他们引用的对象的成员函数被调用。这是很容易通过添加一个“这个”前缀给他们每个人。因此,在功能setid()身体,m_id(这是一个类的成员变量)已转成-> m_id。因此,当这一点简单的地址,这将解决simple.m_id -> m_id。
把它全部放在一起:
1)当我们调用简单,压缩文件SetID(2),编译器实际上调用压缩文件SetID(和简单,2)。
2)在setid(),这个指针保存对象地址的简单*。
3)任何成员变量在setid()前缀是“->”。所以当我们说m_id = ID,编译器实际上是执行这个-> m_id = ID,在这种情况下,更新simple.m_id ID。
好消息是,所有这些都是透明的发生在你作为一个程序员,它并不真的很重要,无论你是否记得它的工作原理。所有你需要记住的是,所有的正常成员函数有一个*这个指针,是指对象的函数被调用。
*这总是指向正在操作的对象
还有一个更详细的照顾。在成员函数中,任何类成员(函数和变量)也需要被更新,所以他们引用的对象的成员函数被调用。这是很容易通过添加一个“这个”前缀给他们每个人。因此,在功能setid()身体,m_id(这是一个类的成员变量)已转成-> m_id。因此,当这一点简单的地址,这将解决simple.m_id -> m_id。
把它全部放在一起:
1)当我们调用简单,压缩文件SetID(2),编译器实际上调用压缩文件SetID(和简单,2)。
2)在setid(),这个指针保存对象地址的简单*。
3)任何成员变量在setid()前缀是“->”。所以当我们说m_id = ID,编译器实际上是执行这个-> m_id = ID,在这种情况下,更新simple.m_id ID。
好消息是,所有这些都是透明的发生在你作为一个程序员,它并不真的很重要,无论你是否记得它的工作原理。所有你需要记住的是,所有的正常成员函数有一个*这个指针,是指对象的函数被调用。
*这总是指向正在操作的对象
int main()
{
Simple A(1); // *this = &A inside the Simple constructor
Simple B(2); // *this = &B inside the Simple constructor
A.setID(3); // *this = &A inside member function setID
B.setID(4); // *this = &B inside member function setID
return 0;
}第二,它有时可能是有用的,有一个类成员函数返回它所工作的对象作为返回值。这样做的主要原因是允许一系列的函数被“链接”在一起,所以几个函数可以被调用在同一个对象上!你实际上已经做了很长一段时间。考虑这个常见的例子,你将一位以上使用std::cout文本:“这个”指针是一个隐式参数隐式添加到任何成员函数中的一个隐藏的参数。大多数时候,你不需要直接访问它,但如果需要的话,你可以。值得注意的是,“这是一个const指针,你可以改变基础对象它所指向的值,但你不可以做点别的!<pre name="code" class="html">#include <iostream>
int main()
{
Calc calc;
calc.add(5).sub(3).mult(4);
std::cout << calc.getValue() << '\n';
return 0;
}
类型转换可以重载提供转换功能,可用于显式或隐式地转换成另一种你的类。
复制构造函数是一种特殊类型的构造函数,用于从同一类型的另一个对象初始化一个对象。复制构造函数是用来直接/统一的初始化从相同类型的一个对象,复制初始化(分数f =分数(5,3)),当传递或返回值的参数。
如果您不提供一个复制构造函数,编译器将为您创建一个。编译器提供拷贝构造函数将逐个成员初始化,意义的复制每个成员从原来的成员初始化。复制构造函数可以省略为优化目标,即使它有副作用,所以不要依赖你的拷贝构造函数的实际执行。
构造函数被认为是默认的转换构造函数,这意味着编译器将使用它们来隐式转换到你的类的对象的其他类型的对象。您可以通过使用构造函数前面的显式关键字来避免这一情况。您还可以在类中删除函数,包括复制构造函数和重载赋值运算符,如果需要的话。如果一个已删除的函数将被调用,这将导致一个编译器错误。
赋值运算符可以重载以允许将赋值给你的类。如果你不提供一个重载的赋值操作符,编译器将为你创建一个。重载赋值操作符应该总是包括一个自赋值检查。
int main()
{
FixedPoint2 a(34, 56);
std::cout << a << '\n';
FixedPoint2 b(9.617); // any decimal digits beyond 2 should be rounded to 2 decimals
std::cout << b << '\n';
FixedPoint2 c(5.01); // stored as 5.0099999... so we'll need to round this
std::cout << c << '\n';
return 0;