本文档旨在分享学习 c++语言过程中遇到的相关知识,便于自己做积累,知识包括但不限于相关软件、c++语法、bug解决方案等。 学习教材:清华大学出版社 C++语言程序设计(第4版)郑莉 网课资料:郑莉老师学堂在线的课程 C++语言程序设计基础 学堂在线 C++语言程序设计进阶 学堂在线
一些偏向代码的小知识点
- 取绝对值函数
fabs(x) - 对变量x的类型转换
static_cast<int>(x) - bool 类型的函数默认返回值是0/1,想要fun(x)返回true/false
cout<<boolalpha<<fun(x) - 科学计数法10^-15:1e-15
unsigned 不可定义负数
一些偏向理论的小知识点
- 在相同作用域中不允许在同一个函数的多个声明中对同一个参数的默认值重复定义,即使值相同也不可(函数声明同理,默认形参值只能在函数原型中给出,之后不能再出现)
- 带默认形参值的函数可以自左向右依次接受传入的新形参值,空缺的将采用默认值
- 在面向对象程序设计中,程序模块是由 类 构成的,类是对逻辑上相关的函数与数据的封装,是对问题的抽象描述
- 在C++中,类的对象就是该类的某一特定实体(实例)
例如:将一个年级所有同学看成一个类,那么每一位同学就是一个特定的实体,也就是一个对象
一些重要的概念及具体说明
- 【值传递&引用传递】
| 值传递是单向的,引用传递是双向的 | 引用传递快占内存小,对形参的作用将直接作用于实参
void swap(int a, int b)
void swap(int &a, int &b)
- 【内联函数】
inline double fun(double x) { return x*x; } | 特点:在编译时将函数体嵌入每一个调用处 | 优点:节省了参数传递、控制转移等开销 | 注意:内联函数要求函数尽量简单,不能出现循环语句,switch语句等; | 内联函数的定义必须出现在内联函数第一次被调用前; | 对内联函数不能进行异常接口申明 - 【函数重载】具有相同的函数名但形参个数或类型不同
| 如果函数名和形参都一样会在编译报语法错误(函数重复定义) | 注意:与形参名和返回值无关 | 应用:一般用于实现相同或类似功能而处理不同类型数据的函数 - 【抽象】对具体问题(对象)进行概括抽出一类对象的公共性质并加以描述
| 对一个问题的抽象包括: 数据(功能)抽象:描述此类区别于其他类的特征,即某类对象的属性或状态 行为(代码)抽象:某类对象的共同行为或功能特征 | 例如:对象(时钟)数据抽象(小时 分钟 秒)行为抽象(显示时间函数 设置时间函数) - 【封装】将抽象得到的数据和行为相结合,也就是将数据与操作数据的函数代码有机结合形成“类”,数据和函数都是类的成员
- 【继承】允许在保持原有类特性的基础上进行更具体的详细说明(在保持原有的属性上增加新的特殊属性)
- 【多态】一段程序能处理多种类型对象的能力
- 【类的成员函数】描述的是类的行为
| 函数的原型声明要写在类中,原型说明函数的参数表、返回值类型,实现成员函数时要指明类的名称。例如:void Clock::setTime(int newH,int newM,int newS) { ... } - 【构造函数】在对象被创建时用特定的值构造对象,将对象初始化为一个特定的状态
| 构造函数的函数名与类名相同,没有返回值,通常声明为公有函数 | 构造函数在对象被创建的时候将被自动调用,如果没有写构造函数则系统会系统生成隐含的默认构造函数(无参数) - 【复制构造函数】使用一个已经存在的对象(参数指定的)去初始化同类的一个新对象
| 系统自动生成的隐含复制构造函数是把初始对象每一个数据成员的值都复制到新建的对象中,具有完全小你沟通的数据成员(属性) | 以下三种情况将调用复制构造函数:
第一类:当用类的一个对象去初始化该类的另一个对象
Point a(1,2);
Point b(a);
第二类:如果函数的形参是类的对象,调用函数时,进行形参和实参结合(只有值传递才会调用,传递引用则不会)
void f(Point p){...}
int main(){
Point a(1,2);
f(a);
}
第三类:如果函数的返回值是对象,函数执行完成返回调用者时(g()是局部函数,离开函数局部对象a就会消亡)
Point g(){
Point a(1,2);
return a;
}
[ps.书本p112 例4-2有三种情况的完整例子]
- 【析构函数】在对象的生命周期即将结束的时候被 自动调用 ,调用后对象消失对应内存空间也被释放,析构函数不接受任何参数
~Clock() {}
一些代码框架
- 一个简单初级的c++应用程序大概有以下代码部分构成(以一个求圆面积的程序为例)
#include <iostream>
using namespace std;
const float PI=3.141593;
class Circle {
public:
Circle(float r);
~Circle(){}
float area();
private:
float radius;
};
Circle::Circle(float r){
radius = r;
}
float Circle::area(){
return PI*radius*radius;
}
int main(){
float radius;
cin>>radius;
Circle myCircle(radius);
float myCircleArea = myCircle.area();
cout<<"the area is:"<<myCircleArea<<endl;
return 0;
}
1.5
the area is:7.06858
其中较短的函数可以直接在定义处写,例如一些取值函数getX() ,getY() 是内部私有数据成员对外的一个接口函数,只需要简单的return x /return y 即可
菜鸡学习积累,如果错误欢迎大佬指正
|