
༺ 个人主页 · 纪念229 ༻
༒专栏目录:《算法》༒
༒专栏目录:《C++》༒
༒专栏目录:《MySQL数据库》༒
༒专栏目录:《前端开发》༒
༺世上本没有路,走的人多了自然就有了༻
本篇文章讲的是C++类和对象最后一节,主要类与对象的代码讲解,希望对你有所帮助
文章目录
1.类和对象代码讲解
这个代码上次没讲完整,这次补充
c
//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
c
//class Solution
//{
// int Sum_Solution(int n) {
// //Sum arr[n];
// //c语言有些编译器支持变长数组有些要加一些配置支持
// //c++不支持变长数组有迭代器vector变长数组在std域内
// //头文件#include<vector>
// vector<Sum> 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域内)
头文件#include
vector<Sum> arr(n);
写了这个东西迭代器会自动调用每个类元素的构造函数
(n)里的n说明做个变长数组有多少元素用的不是n是(n)
c
//class Solution
//{
// public:
// int Sum_Solution(int n)
// {
// //讲的还是类数组
// Sum* arr = new Sum[n];
// //new不需要头文件
// //new的作用是在堆上申请一块空间(此域销毁了空间还在堆中需要手动销毁)
// //如果有类类型会调用构造函数(类对象和类数组都会调用构造函数有了new)
// //new最后返回指针变量
// return Sum::GetRet();
// }
//};
这里还有一个使用类数组的方式(接收的是它的指针变量)
Sum* arr = new Sumn;
用一个new 类名n就构造了一个类数组但是返回的是地址
new不需要头文件
new的作用是在堆上申请一块空间最后要将这个空间销毁
c
//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外面的用不了用了即可调用
调用要加类限定名
调式时看不到成员变量原因是只有静态成员变量不属于对象属于类
要在调试看到要加类限定名 与 静态成员变量名
调用嵌套类直接在前面加类限定名即可
c
//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;
//};
友元类和函数在类中但都是外面的普通类和函数但是可以调用对象的成员变量
对象里有成员变量和非静态成员函数
成员函数可以被多个对象调用
c
//刘备 客卿
class A
{
private:
//静态成员函数要单独在外初始化(调用要加限定名)
static int _k;
int _h = 1;
public:
class B //B默认就是A的嵌套
{
public:
void foo(const A& a)
{
cout << _k << endl;
cout << a._h << endl;
}
private:
int _b1 = 1;
int _b2 = 1;
};
};
int A::_k = 1;
int main()
{
cout << sizeof(A) << endl;
//这里看的是类的字节数,类的字节数
//只与对象的成员变量有关
//_k是静态成员变量不属于对象不计入字节
A aa1;
A::B bb1;
return 0;
}
类的字节数只与对象的成员变量有关(遵从对齐原则)
与静态成员变量无关
2.类和对象错题讲解
主要是讲类与对象我做错的题
A.不一定,因为inline只是一种建议,需要看此函数是否能够成为内联函数
B.inline函数的定义和声明必须在一起
C.inline函数可以在同一个项目的不同源文件内定义函数名相同但实现不同的inline函数
D.递归用inline函数编译器会忽略

这里我们要知道long在Windows 都是4字节
shor 2字节
在64位指针位8字节 32位 4字节
因为是64位且最大默认对齐数是8字节
所以会补成24字节(对齐规则我C语言文章里有)

this指针在非静态成员函数里
文章到这就到一段落,希望对你有所帮助,感谢观看!
