this指针 详解请点这里
复制构造函数详解 点这里和这里
指针的指针的地址,指针自身的地址,指针指向的地址 点这里 实例化解释很好
引用和指针的区别 点这里和这里
引用详解:C++:引用的简单理解 - Tom文星 - 博客园 (cnblogs.com)
volatile关键字参阅:(7条消息) C++中volatile关键字的作用_nguliu的博客-CSDN博客_c++中volatile关键字的作用
类型转换参阅:
C++四种类型转换总结 - evenleo - 博客园 (cnblogs.com)
(7条消息) C++常用的类型转换函数_奇树谦的博客-CSDN博客_c++类型转换函数
复制赋值运算符:
#include<iostream>
using namespace std;
#include<string.h>
class MyString {
private:
char* buffer;
public:
MyString(const char* initInput) { //构造函数,令buffer=initInput
if (initInput != NULL) {
buffer = new char [strlen(initInput) + 1];
strcpy(buffer, initInput);
} else
buffer = NULL;
}
MyString& operator=(const MyString& copySource) { //重载运算符=
if (this != ©Source && copySource.buffer != NULL) {
if (buffer != NULL)
delete[] buffer;
buffer = new char [strlen(copySource.buffer) + 1];
strcpy(buffer, copySource.buffer);
}
return *this;
}
operator const char*() {//类型转换函数
return buffer;
}
virtual ~MyString() {//虚析构函数
delete[] buffer;
}
};
int main() {
MyString string1("Hello ");
MyString string2(" World");
cout << "Before assignment: " << endl;
cout << string1 << string2 << endl;
string2 = string1;
cout << "After assignment string2 = string1: " << endl;
cout << string1 << string2 << endl;
return 0;
}
注:
要创建不允许复制的类,可将复制构造函数和复制赋值运算符都声明为私有的。只需这样声明(而不提供实现)就足以让编译器在遇到试图复制对象(将对象按值传递给函数或将一个对象赋给另一个对象)的代码时引发错误。
subscript:adj. 下标的,写在下方的,脚注的 n. 下标,脚注,下角数码
return_type& operator [] (subscript_type& subscript);
MD,愈发难了,一气我就不学下标运算符了。
函数运算符 operator()
#include<iostream>
#include<string>
using namespace std;
class Display {
public:
void operator()(/*const*/ string input) const { //放在前面和放在后面有啥区别?
cout << input << endl;
}
};
int main() {
Display displayFuncObj;
// equivalent to displayFuncObj.operator () ("Display this string! ");
displayFuncObj("Display this string!");
return 0;
}
用于高性能编程的移动构造函数和移动赋值运算符
(12.5没学)拜拜
用户定义的字面量
语法:
要自定义字面量,可像下面这样定义 operator “” :
ReturnType operator "" YourLiteral(ValueType value)
{
// conversion code here
}
实例化:
#include<iostream>
using namespace std;
class Tem {
public:
double K;
Tem() {}
Tem(long double k): K(k) {}
};
Tem operator"" _C (long double c) {
return Tem(c + 273.0);
}//只能在初始化时赋值
int operator"" _D(long double d) {
return (d + 459.67) * 5 / 9;
}//单独拉出来赋值
Tem operator"" _F(long double f) {
return Tem((f + 459.67) * 5 / 9);
}
int main() {
Tem k1;
k1.K = 31.73_D;
Tem k2(0.0_C);
cout << "k1 is " << k1.K << endl;
cout << "k2 is " << k2.K << endl;
return 0;
}
不能重载的运算符:
类型转换运算符:
在 C++ 的发展过程中,不断有新的 C++ 类型转换运算符出现,这导致 C++ 编程社区分裂成两个阵营:一个阵营继续在其 C++ 应用程序中使用 C 风格类型转换;另一个阵营转而使用 C++ 编译器引入的类型转换关键字。前一个阵营认为,C++ 类型转换难以使用,且有时候功能变化不大,只有理论意义。 后一个阵营则显然由 C++ 语法纯粹论者组成,他们通过指出 C 风格类型转换的缺陷以支持其论点。在现实世界中,这两个观点各行其道,读者最好通过阅读本章以了解每种风格的优缺点,然后形成自己的见解。————《21天学通C++》
使用语法如下:
destination_type result = cast_operator<destination_type> (object_to_cast);
关于这个我在文章开头好像已经引用过了,读者可以去看看,文章笔者都亲读过,感觉不错。
static_cast:
explicit:adj. 易于理解的;明确的;直言的
double Pi = 3.14159265;
int num = static_cast<int>(Pi); // Making an otherwise implicit cast, explicit
cout<<static_cast <double> (num)<<endl;
输出:
3
使用 const_cast
想情况下,程序员将经常在正确的地方使用关键字 const。不幸的是,现实世界并非如此,像下面这样的代码随处可见:
class SomeClass
{
public:
// ...
void DisplayMembers(); //problem - display function isn't const
};
在下面的函数中,以 const 引用的方式传递 object 显然是正确的。毕竟,显示函数应该是只读的,不应调用非 const 成员函数,即不应调用能够修改对象状态的函数。然而,DisplayMembers()本应为 const 的,但却没有这样定义。如果 SomeClass 归您所有,且源代码受您控制,则可对 DisplayMembers()进行修改。然而,在很多情况下,它可能属于第三方库,无法对其进行修改。在这种情况下,const_cast 将是您的救星。
void DisplayAllData (const SomeClass& object)
{
object.DisplayMembers (); // Compile failure
// reason: call to a non-const member using a const reference
}
在这种情况下,调用 DisplayMembers()的语法如下:
void DisplayAllData (const SomeClass& object)
{
SomeClass& refData = const_cast<SomeClass&>(object);
refData.DisplayMembers(); // Allowed!
}
不写了,烦啊,C艹怎么这么烦,投入java的怀抱
问与答
好了,就当我学完了,白白奈