C++面向对象程序设计学习心得

C++面向对象程序设计学习心得

经过几周c++面向对象程序设计的学习,对面向对象程序设计有了一些了解。

递归

简单地讲,递归就是程序直接或间接调用本身的编程技巧,通过把一个不能或不好解决的大问题转化为一个或几个小问题,再把这些小问题进一步分解成更小的小问题,直到最小的问题可以直接解决
递归算法的解题步骤:
1)分析问题、寻找递归:出大规模问题与小规模问题的关系,这样通过递归使问题的规模逐渐变小
2)设置边界、控制递归:找出停止条件
3)设计函数、确定参数:设计函数体中的操作及相关参数。
这里给出一个简单的例子:

求最大公约数:

递归:gcd ( m, n ) = gcd ( n, m % n )
终止条件:gcd(m,0)=m
(这里我们约定m>n)

GCD(m,n) 
  {   if (n==0) return(m);
      else return (GCD(n,m mod n));
  }

复合数据类型

在这里插入图片描述

结构体

结构体可以把不同类型、不同含义的数据当作一个整体来处理。
特点:
(1)可以对结构体变量的整体进行操作。
(2)可以对结构体变量的成员进行操作。
引用结构体变量中成员的格式为:
结构体变量名. 成员名
(3)结构体变量的初始化方法与数组类似。
小技巧: cout<<fixed<<setprecision(6)<<stu.weight<<endl中流操作符 fixed,它表示浮点输出应该以固定点或小数点表示法。使用setprecision(n)可控制输出流显示浮点数的数字个数。
另外注意,在定义结构体变量时,不能对其初始化,因为定义结构体时,并未给其分配内存,所以初值是无法存储的。
应该声明结构体变量后,手工赋值。)

运算符重载

运算符重载可以解决结构体或自定义数据类型的加法、减法等特殊含义的运算。
一般格式:
类型名 operator 运算符 (const 类型名 变量)const{

}

字符串

1.string 表示可变长度的字符序列
字符串是对象
基本操作:
(1)各种初始化方式(string s1(6,‘a’)的输出为aaaaaa)
(2)字符串之间的复制、比较、连接
(3)查询字符串长度和判断字符串是否为空
(4)访问字符串中的单个字符
(注意:1.给字符串提供数据时,遇空格或回车键结束;
2.在getline()函数中从指定输入流中读取内容,遇到换行符为止。)
2.字符串加 [ ],变成数组
在这里插入图片描述

指针

1.定义指针变量的语法:
类型 *指针变量;(注意:每个指针都有相关的类型,要在定义指针时指出)
2.取地址运算符“&”和指针解引用运算符“*”
(注意:可以定义存放指针对象的地址的指针。
例如:int **ppi = &pi; //ppi是指针的指针,存放pi的地址)
3.空指针
// 生成空指针的2种方法
**int p1 = 0;
int p2 = NULL;

4.使用指针的注意事项
(1)定义指针时,应该对指针进行初始化
(2)指针的运算
A.同类型的指针可以进行相等(==)或不相等(!=)的比较操作,比较的结果是布尔类型
B.指针可以进行加或减整数值的算术运算
C.自增、自减运算适用于指向数组元素的指针
5.通用指针void *
6.动态存储空间管理

(1)new运算符
a.分配单个对象:new 类型 或者 new 类型(初始值)
b.分配多个连续存储的对象:new 类型[数组大小]
c.定位new,在指定位置分配空间:new (指针) 类型;
(注意:1.不能对数组进行显式的初始化
2.数组大小不必是常量,是数组元素的个数,不是字节数
3.用new分配数组时,并未得到一个数组类型的对象,而是得到一个数组元素类型的指针)
(2)delete运算符
a.释放new分配的单个对象的delete形式
delete 指针;
b.释放new分配的数组的delete形式
delete[] 指针;
c.定位new没有对应的delete表达式

引用

1.引用又称为别名,它可以作为对象的另一个名字;
2.通过引用可以间接地操纵对象;
3.在程序中,引用主要用作函数的参数

类和对象

类的定义

格式:
class 类名
{
public:
公有数据成员和成员函数;
protected:
保护数据成员和成员函数;
private:
私有数据成员和成员函数;
};
注意
1.类的数据成员可以是其他类的对象,但不能以类自身的对象作为本类的成员,而类自身的指针和引用可以作为类的成员。
2.类定义必须以分号“;”结束。
3.类与结构体的区别:
没有明确指定类成员的访问权限时,C++结构体的成员是公有的,而类的成员是私有的。)

成员函数

定义:类的成员函数是实现类的行为属性的成员。
(注意:一般将成员函数声明为函数原型,在类外具体实现成员函数。)
格式:
返回值类型 类名::成员函数名(参数表)
{
函数体
}

对象

●对象是类的实例或实体。
●类与对象的关系,如同C++基本数据类型和该类型的变量之间的关系。
对象成员访问:
●圆点访问形式:对象名.公有成员
●指针访问形式:对象指针变量名->公有成员

重载函数

函数名相同,但参数不相同(类型不同,或者个数不同)的一组函数。

构造函数和析构函数
构造函数

1.构造函数是用于创建对象的特殊的成员函数,可以为对象分配空间;对数据成员赋初值;请求其他资源。构造函数不光可以 初始化对象,还可以进行其他资源的初始化。
2.构造函数名与类名相同
3.构造函数可以重载
4.构造函数可以有任意类型的参数,但没有返回类型
(注意:用户没有定义的构造函数时,系统自动提供缺省版本的构造函数,而如果我们定义构造函数,系统则不会主动生成默认构造函数,当我们定义的对象没有给参数时是非常危险的。所以我们如果定义构造函数,最少要定义两个,一个带参,一个不带参。)

析构函数

析构函数是用于取消对象的成员函数
当一个对象作用结束时,系统自动调用析构函数
析构函数的作用是进行对象消亡时的清理工作
没有用户定义析构函数时,系统提供缺省版本的析构函数
析构函数名为: ~ 类名
析构函数没有参数,也没有返回类型

初始化

构造函数初始化成员有两种方法:

1.使用构造函数的函数体进行初始化
2.使用构造函数的初始化列表进行初始化

必须使用初始化列表的几种情况:
1、数据成员为常量
2、数据成员为引用类型
3、数据成员为没有无参构造函数的类的对象
(注意:
类成员的初始化的顺序:按照数据成员在类中的声明顺序进行初始化,与初始化成员列表中出现的顺序无关)

this指针

使用:
(1)在类的非静态成员函数中返回类对象本身或对象的引用的时候,直接使用 return *this,返回本对象的地址时,return this。
(2)当参数与成员变量名相同时,如this->x = x,不能写成x = x。
(3)避免对同一对象进行赋值操作,判断两个对象是否相同时,使用this指针。

复制构造函数

语法形式
类名 :: 类名(const 类名 & 引用名 , …);
(注意:1.这里的const的作用是保护实参对象只读
2.复制构造函数要求有一个类类型的引用参数。
3. 如果没有显式定义复制构造函数,系统自动生成一个默认形式的复制构造函数。 )
以下三种情况下由编译系统自动调用:
1.声明语句中用类的一个已知对象初始化该类的另一个对象时。
2.当对象作为一个函数实参传递给函数的形参时,需要将实参对象去初始化形参对象时,需要调用复制构造函数。
3.当对象是函数的返回值时,由于需要生成一个临时对象作为函数返回结果,系统需要将临时对象的值初始化另一个对象,需要调用复制构造函数。

深复制和浅复制
浅复制:

●在用一个对象初始化另一个对象时,只复制了数据成员,而没有复制资源,使两个对象同时指向了同一资源的复制方式称为浅复制。
即:对于复杂类型的数据成员只复制了存储地址而没有复制存储内容
默认复制构造函数所进行的是简单数据复制,即浅复制

深复制

● 通过一个对象初始化另一个对象时,不仅复制了数据成员,也复制了资源的复制方式称为深复制。
● 自定义复制构造函数所进行的复制是浅复制。
(注意:深复制构造函数必须显式定义)
深复制构造函数的特点
定义:类名::类名([const] 类名 &对象名);
成员变量的处理:对复杂类型的成员变量,使用new操作符进行空间的申请,然后进行相关的复制操作。
下面给出一个例子:

Person::Person(const Person& P0) //复制构造函数的实现
{
   	 name=new char[strlen(P0.name)+1];
	strcpy(name,P0.name);
	age=P0.age;
	salary=P0.salary;
cout<<"ff"<<endl;
}
常成员

1.常数据成员是指数据成员在实例化被初始化后,其值不能改变。
2.在类的成员函数说明后面可以加const关键字,则该成员函数成为常量成员函数

常对象

如果在说明对象时用const修饰,则被说明的对象为常对象。
常对象的说明形式如下:
类名 const 对象名[(参数表)];
或者
const 类名 对象名[(参数表)];
在定义常对象时必须进行初始化,而且不能被更新。
说明:
(1)C++不允许直接或间接更改常对象的数据成员。
(2)C++规定常对象只能调用它的常成员函数、静态成员函数、构造函数(具有公有访问权限)。

静态成员

定义:1.类成员冠以static声明时,称为静态成员。
2.静态数据成员为同类对象共享。
3.静态成员函数与静态数据成员协同操作。
注意:(静态成员不属于某一个单独的对象,而是为类的所有对象所共有
定义静态成员函数的格式如下:
static 返回类型 静态成员函数名(参数表);
公有访问权限的静态成员,访问形式如下:

1.类名::静态成员函数名(实参表)
2.对象. 静态成员函数名(实参表)
3.对象指针->静态成员函数名(实参表)
4.在静态成员函数内部,直接访问

友元函数(不建议使用)

1.如果在本类(类A)以外的其他地方定义了一个函数(函数B)
A.这个函数可以是不属于任何类的非成员函数,
也可以是其他类的成员函数,
B.在类体中用friend对其(函数B)进行声明,此函数就称为本类(类A)的友元函数。
2.友元函数(函数B)可以访问这个类(类A)中的私有成员
友元类的声明格式:
==friend class 类名; ==

运算符重载

1.一元运算符
Object op 或 op Object
A.重载为成员函数,解释为:
Object . operator op ()
操作数由对象Object通过this指针隐含传递
B.重载为友元函数,解释为:
operator op (Object)
操作数由参数表的参数Object提供
2.二元运算符
ObjectL op ObjectR
A.重载为成员函数,解释为:
ObjectL . operator op ( ObjectR )
左操作数由ObjectL通过this指针传递,右操作数由参数ObjectR传递
B.重载为友元函数,解释为:
operator op ( ObjectL, ObjectR )
左右操作数都由参数传递
3.重载运算符[]和()
A.运算符 [] 和 () 是二元运算符
B.[] 和 () 只能用成员函数重载,不能用友元函数重载
重载格式 类型 类 :: operator[] ( 类型 ) ;
重载格式 类型 类 :: operator() ( 参数表 ) ;
(操作数类型不相同时,必须使用友元函数。)

学习感受

经过几个周的学习,感受颇深:
第一,感觉挺累的。这个学期课程很多,因为我是转专业过来的,补修课程都要在这个学期进行,课程量较大,有些课程还较难,不易理解。有的时候老师一布置作业就想吐,一开始老师布置的作业有点看不懂,不理解,只能找大佬问,或者上网查阅资料,真就像老师所说:“”想要完成我的作业,不熬几个夜做不出来。“”程序写了又写,改了又改,勉强到最后的提交时间才能交上作业。
第二,磨练了意志。每次做老师作业时,都要进行自我怀疑,反思自己平时到底有没有认真学,极度焦虑,极度抑郁,感觉自己啥都不会,啥也不是。然后丧失信心,不想再写,但是还要硬着头皮写。好不容易写完了,编译一下,n处报错,除了失落还是失落。。。就感觉每一次的作业都是对自己的一次洗礼。duang~
第三,激发了斗志。每次作业对我都是一项艰难的工作。然而还是有不少大佬能很快的完成并获得不错的成绩(真的好羡慕那些成绩为A的qaq)。大家都很努力,而我,技不如人,有的时候还偷懒。惭愧惭愧。。。我也要更加努力才是!!!
第四,感谢老师。老师上课讲解分析透彻,对我们严格要求。这段时间过得很充实,从老师哪里不止是学到了知识,还学到了处事的道理,感觉比以前进步了,感谢老师!
第五,对自己未来的期望。希望未来的这段时间老师布置的作业能够尽早完成,并能获得一个满意的成绩。在未来的相当一段长的时间里希望自己能够更加努力,广涉猎,多学习,不能只局限于课本知识,认真坚持专注。

不是在一瞬间就能脱胎换骨的,生命原是一次又一次的试探。
  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值