首页 > 技术文章 > c++程序设计课程总结

Deliberator 2020-10-04 21:36 原文

绪论

基本概念

1.对象:(系统中用于描述客观事物的一个实体,系统的基本单位),由一组属性和一组行为组成。
2.类:具有相同属性和行为的一组对象的集合
3.封装:把对象的属性和服务结合承一个独立的系统单位,并尽可能隐蔽对象的内部细节
4.继承:特殊类的对象具有其一般类的全部属性和行为
5.多态性:特殊类可以具有不同于一般类的属性和行为

计算机信息存储

计算机内部信息->控制信息:指令/控制字
->数据信息:数值信息/非数值信息

原码,反码,补码

原/反/补码是将真值转化为机器数的方式。

求法

正数:转化为二进制数,最高位添加符号位,0为正,1为负(三码相同)
负数:
1.原码求法同正数
2.反码:符号位同原码,其它位取反
3.补码:符号为同原码,其它位取反加一

关于补码的运算规则目前无法理解原理

类与对象

1.类的一个不安全操作

class A {
public:
    int &get() {return x;}
private:
    int x;
}a;
main函数中:
int &temp=a.get();

此时修改temp的值会使a.x受到修改。
2.(1)类的数据成员不可在定义中赋予初值
(2)类中static修饰的变量可以赋予初值

class A {
private:
    static int a;
};
int A::a=5;

3.组合类的(复制)构造函数
Line::Line(Point xp1,Point xp2):p1(xp1),p2(xp2);
Line::Line(Line &l):p1(l.p1),p2(l.p2);
(1)括号中为形参,单冒号后的括号中的参数来源于第一个括号
(2)成员对象会根据参数选择相应构造函数
Add:构造函数的几种表示
<1>A(string name) {(*this).name=name;}
<2>A::A(string name):name(name) {}
<3>A(string name) {name=name;}
前两种是对的,后一种是错的
4.enum类型的理解
可以理解为两部分:
(1)全局const定义了enum内的标识符
(2)数据类型本身可看做int
5.类的相互对象引用不会报错,但无法运行(引用必须初始化,然而无法初始化)
例子:

class Fred;
class Barney {
	Fred &x;
};
class Fred {
	Barney &y;
};

6.前向引用声明只是声明,在完整定义后才可调用。

class Fred;
class Barney {
public:
    int f(Fred qwq); //此处不能写为int f(Fred qwq) {}
private:
	Fred &x;
};
class Fred {
	Barney &y;
};
//int f(Fred qwq) {}应写在这里

7.复制构造函数必须使用引用传递,避免递归调用
当一个对象需要以值方式传递时,编译器会生成代码调用它的拷贝构造函数以生成一个复本。如果类A的拷贝构造函数是以值方式传递一个类A对象作为参数的话,当 需要调用类A的拷贝构造函数时,需要以值方式传进一个A的对象作为实参;而以值方式传递需要调用类A的拷贝构造函数;结果就是调用类A的拷贝构造函数导 致又一次调用类A的拷贝构造函数,这就是一个无限递归。
8.c++中文占两个字节,要使用字符数组或string存储
9.关于指针的几点
(1)p[i]等价于*(p+i)
(2)在类中运用指针:
一要重载等号和复制构造函数,且要完成深复制,防止重复释放内存。(此时会导致main函数返回值不为0)
二要及时释放内存,一方面是重载析构函数,另一方面是深复制时要把原本的内存空间释放(这会导致内存碎片的问题,不过在现代编译器中已用算法解决)
三是重载了(复制)构造函数后,不会再生成默认的构造函数,要手动定义。
10.复制构造函数在等号赋值时不会调用,此时需要重载等号。
注意!!!重载等号要在operator前加&,不然会导致程序异常结束。

推荐阅读