常州做网站公司哪家好,云南网站建设快速优化,手机单页网站模板,深圳开发网站的公司哪家好文章目录参考描述实例成员与静态成员实例成员静态成员静态成员属性隐式形参 this 指针冲突this 指针静态成员函数this 指针与静态成员函数参考
项目精通C #xff08;第九版#xff09;托尼加迪斯、朱迪沃尔特斯、戈德弗雷穆甘达 #xff08;著#xff09; / 黄刚 等 第九版托尼·加迪斯、朱迪·沃尔特斯、戈德弗雷·穆甘达 著 / 黄刚 等 译搜索引擎Bing
描述
项目描述编译器gcc version 8.1.0 (x86_64-win32-seh-rev0, Built by MinGW-W64 project)操作系统Windows 10 专业版64 位
实例成员与静态成员
类中的成员大致可分为如下四种
实例成员属性实例成员函数静态成员属性静态成员函数
实例成员
实例成员即类的实例中的成员。实例成员从类中得来最终归属于由类创建的实例对象。每一个实例对象中都含有类中的非静态成员的副本。
静态成员
静态成员归属于类由类的所有实例对象所共享。 如果将一个成员属性声明为静态成员属性则该类的所有对象都可以访问该成员属性。如果将一个成员函数声明为静态成员函数那么该函数将能够在类的任何实例被创建前调用。 上述内容整理自 静态 C第九版 静态成员属性
在声明成员属性时使用 static 关键字将能够将该成员属性声明为静态成员属性。对此请参考如下示例
#include iostream
#include string
using namespace std;class Notebook
{public:// 声明静态成员属性 contentstatic string content;
};// 定义静态成员属性
string Notebook::content Hello World;int main(){// 实例化Notebook notebook_1;Notebook notebook_2;cout notebook_1.content endl;// 通过 notebook_2 对象修改静态成员属性notebook_2.content TwoMoons;// 再次通过 notebook_1 对 content 进行访问cout notebook_1.content endl;system(pause);
}执行效果
Hello World
TwoMoons
请按任意键继续. . .注
静态成员属性 必须在类中声明在类外定义。若在类中进行声明并对其初始化那么 C 将因此抛出错误。
隐式形参 this 指针 默认情况下编译器为类的每个成员函数提供了一个隐式形参该形参指向被调用的成员函数所在的对象。该隐式形参称为 this 。 上述内容引用自 精通 C 第九版 隐式形参 this 为一个指针指向函数所在的对象。你可以在成员函数中直接使用隐式形参 this 。实际上当你在成员函数中直接访问类中的成员时就已经隐式地使用了 this 指针。
举个栗子
#include iostream
#include string
using namespace std;class Notebook
{public: string content Hello World;void echo(){// 输出所属类的地址以十进制展示cout (long long)this endl;// 输出所属类的 content 成员属性cout this - content endl;};
};int main(){// 实例化Notebook notebook;notebook.echo();system(pause);
}执行效果
6422000
Hello World
请按任意键继续. . .注
this 指针仅能指向由所属类实例化的对象将实参赋予形参的操作将在创建类的实例对象的过程中自动完成。
冲突
当成员函数的形参与成员属性同名时在成员函数的内部将发生冲突成员属性将被隐藏。对此请参考如下示例
#include iostream
#include string
using namespace std;class Notebook
{public:string content TwoMoons;void read(string content){// 输出 content cout content endl;};
};int main(){Notebook notebook;notebook.read(RedHEart);system(pause);
}执行结果
RedHEart
请按任意键继续. . .在成员函数中向控制台输出 content 中保存的数据结果是将 形参 content 中的内容进行输出而 成员属性 content 被忽略。
this 指针
通过 this 指针我们可以在发生冲突的成员函数内部冲破同名形参的封锁访问同名的成员属性。对此请参考如下示例
#include iostream
#include string
using namespace std;class Notebook
{public:string content TwoMoons;void read(string content){// 输出 content cout content endl;// 输出成员属性 content cout this - content endl;};
};int main(){Notebook notebook;notebook.read(RedHEart);system(pause);
}执行结果
RedHEart
TwoMoons
请按任意键继续. . .静态成员函数
通过在函数头前添加 static 关键字即可将该函数声明为所属类的静态成员函数。静态成员函数可在任何实例对象被创建前调用。对此请参考如下示例
#include iostream
#include string
using namespace std;class Notebook
{
public:// 声明静态成员属性static string content;// 声明静态成员函数static void read(){// 访问静态成员属性cout content endl;}
};
// 初始化静态成员属性
string Notebook::content Hello World;int main()
{// 在类的任何示例创建前调// 用静态成员函数Notebook::read();// 实例化 NotebookNotebook notebook;// 你也可以通过实例化对象对// 静态成员函数进行调用。notebook.read();system(pause);
}执行效果
Hello World
Hello World
请按任意键继续. . .注
与静态成员属性不同静态成员函数可以在类中声明在类外定义也可以直接在类中完成所有操作。静态成员函数常用于处理静态成员属性。
this 指针与静态成员函数
由于静态成员函数属于类而非类的实例因此静态成员函数不具有隐式形参。这也导致了静态成员函数无法直接访问类中的非静态成员。
举个栗子
#include iostream
#include string
using namespace std;class Notebook
{public:string content Red HEart;static void read(){// 如下两条语句将导致 C 抛出错误// cout content endl;// cout this endl;}
};int main(){Notebook::read();system(pause);
}