石家庄网站推广专家,深圳市西特塔网站建设工作室,在线简历免费制作网站,在线广告平面设计笔者觉得好用的学习方法#xff1a;模板法
1.采用原因#xff1a;由于刚从c语言面向过程的学习中解脱出来#xff0c;立即把思路从面向过程转到面向对象肯定不现实#xff0c;加之全新的复杂语法与操作#xff0c;着实给新手学习这门语言带来了不小的困难。所以#xff…笔者觉得好用的学习方法模板法
1.采用原因由于刚从c语言面向过程的学习中解脱出来立即把思路从面向过程转到面向对象肯定不现实加之全新的复杂语法与操作着实给新手学习这门语言带来了不小的困难。所以笔者探索出了一种好用的学习方法模板法。
2.采用方法在接触新知识时没有必要从一开始便理清新知识的来龙去脉可以先去csdn上学习新知识的模板和语法再写一些简单程序以强化理解。在听完学校的课程后写作业时可以先使用ai写一道简单题并学习其格式和逻辑再自己写难题
笔者觉得好用的纠错方法程序示踪法
1.采用范围程序报错且错误在认知范围内如果遇到认知范围外的错误或者不报错却运行不了请直接找老师解决或者用AI检验
2.为什么笔者觉得它比调试更加高效因为在调试的时候为了理清监视变量的变化需要在循环的每一步认真分析这样会浪费大量时间。所以笔者在程序报错时首先会检查指针越界和数组循环问题然后分块将代码注释并运行通过成功运行的部分不断扩大最终找到问题所在或者当itc报错而不显示输入数据时在每次输入后都打印一遍以获得数据在检查类的析构构造组合多态等复杂的问题时让每个函数都打印特定的值以确定函数失效的部分
类与对象
1.数据的封装在一个类中有public,private,protected三种成员它们对应了不同的保密程度这点与数据封装有关它们的区别是public可以由任意操作进行访问而protected只能由本类和子类的成员函数访问子类笔者下文会讲private的封装性更好只能由本类的成员函数访问注意在自己写题的时候尽量写成public类一是写题没有封装性要求二是防止因自己写的子类函数无法访问基类成员而纠错,三种成员必须显示声明如public:再写public类型的数据成员与成员函数否则默认为private类型。
2.成员在一个类中有几个固定的组成部分数据成员与成员函数。其中成员是类所具有的数据如整型浮点型字符型数组指针甚至其他的类。具体参考c语言的结构体而成员函数有以下三种构造函数必须显示声明分为三种默认构造函数赋值构造函数与复制构造函数默认构造函数的格式为类型名{} 赋值构造函数就和普通的函数一样将实参复制为形参复制后释放复制构造函数既可以显示声明也可以不声明系统自己会生成一个但如果要用记得声明它的格式如下
class good
{
public:
int b;
good(){};
good(const good a)
{
ba.b;
}
};
普通成员函数和写在类外的函数只有一个区别就是它可以调用本类中的一切数据成员
析构函数与构造函数的格式类似前面需要加一个~小提示键盘左上角它可以自己定义或者由系统自动生成往往与打印某些语句有关。
3.new与delete这两个函数的使用参考malloc与free笔者在动态内存存储中有讲动态内存管理-CSDN博客只要使用了new就必须显示声明析构函数并将空间delete掉delete[]表示释放一个数组的空间至于原因就由下面的话题来解释◕‿◕
深拷贝与浅拷贝
1.不出意外我们的所有数据都进行了深拷贝即成功拷贝可以理解为不报错的拷贝。
2.但是不出意外的情况下还是出意外了当我们准备拷贝指针以及指针类型的数据(字符串数组函数类)时出现了一个问题这些拷贝的都是目标内存空间的地址地址只有一个所以当复制构造完成时我们的对象a(书接上文代码)就被释放了而这些空间被释放后原对象也会对这些空间进行释放但它们已经不存在了所以就出现了错误。
3.解决方法给这些数据一个新的空间把指针指向的数据放进去这时候指针只是一个媒介只是指指路真正操作的是它指向空间的数据
4.代码演示
class good
{
public:
int *p;//此处一般为数组good (const good d)//拷贝构造函数深拷贝版
{p new char[strlen(d.p) 1];//为这个指针申请一个新空间if (p ! 0){strcpy(p, d.p);//只操作数据不操作指针析构记得delete};
函数重载引入重要思想多态性
1.为什么要有多态性俗话说“一千个读者就有一千个哈姆雷特”在生活中我们使用同一个工具在不同场景中的使用方法和结果是不一样的而c中的函数重载正是还原了这点。一个函数因为参数函数体返回结果的不同实现了多种实现方式这就是传说中的多态性。
2.函数重载的方法一个函数名因不同参数而产生不同情况。所以可以在这些情况下随意使用不需要写多个函数增加了代码的可读性代码如下
int add(int a,int b)
{
return ab;
}
float add(float a,float b)
{
return ab;
}
类的组合与类的继承引入重要思想继承
1.为什么要引入类的组合与类的继承因为c在尽力复刻生活中的关系比如机器与零件的组合关系以及父与子之间的继承关系。
2.格式类的组合在大类中的声明和数据成员一样如good a;,但注意组合类的声明必须在大类之前类的继承必须保证基类函数在子类函数之前声明继承有三种方式public,protected和private不同的方式下继承导致成员类型发生变化的情况如下表 3.继承格式class 子类名继承方式 基类名
4.继承方式分为单继承与多继承即父类与子类对象一对一和多对一已知子类可以调用父类的成员和成员函数那么出现重叠怎么办所以就有了如下定义
虚基类虚函数与抽象类顺序问题
1.虚基类引入目的解决代码在多继承中出现的冲突问题由最远的基类成员来提供基类数据注意引入时要在第一级继承时将共同基类设置为虚基类在继承类型前加virtual
2.顺序问题请看下表 注意析构函数的执行过程与构造函数相反先构造后析构。
3.虚成员函数必须为非静态函数它的功能是在基类中定义的虚函数子类可根据自身情况进行覆写以达到不同的需求。格式就是在函数前面加上virtual
4.虚析构函数用的少作用就是通过基类指针删除对象或者调用对象的析构函数格式就是在~前加个virtual
5.纯虚函数与抽象类当一个函数虚到只有一个函数名是重要的时候会以virtual 函数名 形参表0的形式输出而含有纯虚函数的类叫做抽象类它具有以下特点 6.每个子类都要把基类的全部纯虚函数都重写一遍哪怕是空函数注意是全部
运算符重载
1.通过运算符重载我们就可以实现有关类的一切运算
2.运算符重载有两种方式一种是类的成员函数一种是类的友元函数在函数或者类前面加个friend代表此函数或者此类可以访问该类的成员及成员函数前者的格式为返回类型 operator 需要重载的运算符除了本类外的其他参数或类{实现过程}注意*this代表本函数的指针后者的格式就是在前者格式的最前面加一个friend在参数多加一个类
3.本快知识就是模板笔者做过一道题读者可以参考一下模板和方法比较全
【问题描述】实现Mystring类类结构如下
class MyString{
private: char str[1024]; unsigned len;/*字符串长度*/
public: MyString() MyString operator(const char *mstr)/*常量字符串赋值*/ MyString operator(const MyString mstr)/*同类型赋值*/ MyString operator(const MyString mstr)/*字符串拼接*/ char operator [](int i)/*查询串内字符*/ bool operator(const MyString mstr)/*判断是否相等*/ bool operator!(const MyString mstr)/*判断是否不等*/ void operator(const MyString mstr)/*字符串拼接赋值*/ bool operator(const MyString mstr)/*按典序比较*/ bool operator(const MyString mstr)}/*同上*/ friend ostream operator(ostream out,const MyString mstr);/*友元输出流符号重载*/
};
主函数结构如下
int main()
{ char ts[1024]; cints; MyString s; s ts; cints; MyString ss; ss ts; if(ss s) coutequalendl; if(ss ! s) { coutNot equalendl; if(s ss) couts da yu ssendl; if(s ss) couts xiao yu ssendl; } ss s; MyString sss; sss s ss; sss[0] $; coutsssendl; return 0;
}
#请勿修改主函数请勿使用C的string类#
【输入形式】两个字符串以换行隔开
【输出形式】调用所给main函数
【样例输入】
abcd
abcde
【样例输出】
Not equal
s xiao yu ss
$bcdabcdeabcd
运算符重载 · 王赫辰/c语言 - Gitee.com