C++类和对象(最终篇) ༺ 个人主页 · 纪念229 ༻我的博客主页༒专栏目录《数据结构》༒༒专栏目录《算法》༒༒专栏目录《C》༒༒专栏目录《MySQL数据库》༒༒专栏目录《前端开发》༒༒其它有趣的计算机知识༒༺世上本没有路走的人多了自然就有了༻本篇文章讲的是C类和对象最后一节主要类与对象的代码讲解希望对你有所帮助文章目录1.类和对象代码讲解2.类和对象错题讲解1.类和对象代码讲解这个代码上次没讲完整这次补充//class Sum//{//public:// Sum()// {// _ret _i;// _i;// }//// //静态成员函数属于类不属于对象// //只可以调用静态成员变量// //静态成员函数没有this指针// //静态成员函数不经过对象也能调用// // a.GetRet();(可以不推荐)// // A::GetRet();(推荐调用方法)//// static int GetRet()// {// return _ret;// }// //static在不同位置上的含义// //局部变量 延长到全局函数结束结束// //全局变量/函数 只可在本文件可见隐藏// //类成员 不属于对象无this//////private:// static int _i;// static int _ret;// //静态成员变量// //也可以被成员函数调用////};////int Sum::_i 1;//int Sum::_ret 0;////静态成员变量属于类要在外面初始化////////所以这里我们要区分好类函数成员函数////类变量成员变量//////但是类函数要放在类里声明定义在成员函数前加一个static就是静态成员函数静态成员函数没有this指针静态成员函数不属于对象属于类调用时不用对象方便只可以调用静态成员变量但是成员函数可以调用成员变量和静态成员变量静态成员变量不属于类在构造函数调用后不会消失可用于等差数列等静态成员变量初始化要在类外面static在不同位置上的含义局部变量 寿命延长至全局函数结束全局变量/函数 只有本文件可见(隐藏)类成员不属于对象无this//class Solution//{// int Sum_Solution(int n) {// //Sum arr[n];// //c语言有些编译器支持变长数组有些要加一些配置支持// //c不支持变长数组有迭代器vector变长数组在std域内// //头文件#includevector// vectorSum arr(n);// //这里是类数组的实例化实际上是数组内每个类都会调用构造函数////// return Sum::GetRet();// }////};//class Sum//{//public:// Sum()// {// _ret _i;// _i;// }//// static int GetRet()// {// return _ret;// }//private:// static int _i;// static int _ret;//};//////int Sum::_i 1;//int Sum::_ret 0;这里就是静态成员函数/变量的具体代码用法等差数列想法就是利用构造函数调用实现求n项和在成员函数里写个类数组将它实例化它的每个元素类都会进行实例化调用构造函数因为调用的是静态成员变量生命周期长可以实现等差数列求n项和但是c不支持变长数组所以我们需要有关变长数组的迭代器(vector)(且这个东西在std域内)头文件#includevectorSum arr(n);写了这个东西迭代器会自动调用每个类元素的构造函数(n)里的n说明做个变长数组有多少元素用的不是[n]是(n)//class Solution//{// public:// int Sum_Solution(int n)// {// //讲的还是类数组// Sum* arr new Sum[n];// //new不需要头文件// //new的作用是在堆上申请一块空间(此域销毁了空间还在堆中需要手动销毁)// //如果有类类型会调用构造函数类对象和类数组都会调用构造函数有了new// //new最后返回指针变量// return Sum::GetRet();// }//};这里还有一个使用类数组的方式接收的是它的指针变量Sum* arr new Sum[n];用一个new 类名[n]就构造了一个类数组但是返回的是地址new不需要头文件new的作用是在堆上申请一块空间最后要将这个空间销毁//class Solution {// //类里面可以嵌套一个类//public:// //类定义不写访问限定符为private外面用不了嵌套的类// //改为public即可// class Sum {//Sum是Solution的嵌套// public:// Sum()// {// _ret _i;// _i;// }// };//public:// //Sum_Solution函数是Solution的成员函数// int Sum_Solution(int n)// {// //写个指针变量存类数组// Sum* arr new Sum[n];// //Sum* arr new Sum(n);// //这里不是new Sum(n);// //是new Sum[n];// return _ret;// }//private:// static int _i;// static int _ret;//};////int Solution::_i 1;//int Solution::_ret 0;////调试时Solution里看不到成员变量////因为该类没有成员变量那两个是静态成员变量////不在对象里属于类////调试时直接写变量名看不到要写类限定名////加变量名才可看见(它属于类不属于类的对象)//int main()//{// Solution s;// Solution::Sum a[3];// //通过类限定名调用嵌套的类 将其对象实例化// cout s.Sum_Solution(10) endl;// return 0;//}这里之前没在嵌套类前写访问限定符public外面的用不了用了即可调用调用要加类限定名调式时看不到成员变量原因是只有静态成员变量不属于对象属于类要在调试看到要加类限定名 与 静态成员变量名调用嵌套类直接在前面加类限定名即可//class A//{// friend class B;// //友元函数和友元类都在类中但都是外面普通// //的函数和类只是可以调用该对象的成员变量//// //对象里有成员变量后非静态成员函数// //成员函数可以被多个对象调用////////private:// int _a1 1;// int _a2 2;//};////class B//{//public:// void func1(const A aa)// {// cout aa._a1 endl;// cout _b1 endl;// }//// void func2(const A aa)// {// cout aa._a2 endl;// cout _b2 endl;// }//private:// int _b1 3;// int _b2 4;//};友元类和函数在类中但都是外面的普通类和函数但是可以调用对象的成员变量对象里有成员变量和非静态成员函数成员函数可以被多个对象调用//刘备 客卿class A{private://静态成员函数要单独在外初始化(调用要加限定名)staticint_k;int_h1;public:class B//B默认就是A的嵌套{public:voidfoo(constAa){cout_kendl;couta._hendl;}private:int_b11;int_b21;};};intA::_k1;intmain(){coutsizeof(A)endl;//这里看的是类的字节数类的字节数//只与对象的成员变量有关//_k是静态成员变量不属于对象不计入字节A aa1;A::B bb1;return0;}类的字节数只与对象的成员变量有关遵从对齐原则与静态成员变量无关2.类和对象错题讲解主要是讲类与对象我做错的题A.不一定因为inline只是一种建议需要看此函数是否能够成为内联函数B.inline函数的定义和声明必须在一起C.inline函数可以在同一个项目的不同源文件内定义函数名相同但实现不同的inline函数D.递归用inline函数编译器会忽略这里我们要知道long在Windows 都是4字节shor 2字节在64位指针位8字节 32位 4字节因为是64位且最大默认对齐数是8字节所以会补成24字节对齐规则我C语言文章里有this指针在非静态成员函数里文章到这就到一段落希望对你有所帮助感谢观看