课时一:简单的程序设计
-
标识符
-
定义:由数字、大小写字母和下划线组成必须由字母或下划线开头。对大小写敏感。
-
分类:
-
基本数据类型
特殊:指针*p 4(固定为 long int类型)
注1:精度低自动转化为精度高的。
-
常量与变量
-
八进制:正负号和0开头(不能出现8这个数字)
-
十六进制:正负号或0x开头
-
字符常量:
-
'a' :一个字节 "a":两个字节,包括\0
-
\ddd:表示八进制字符(只占一个字节)
-
\xdd:表示十六进制字符(1字节)
-
strlen程序碰到\0终止。sizeof算上所有的字符,最后还要加上\0的结束。
-
-
指数:e的后面必须是整数。
-
-
运算符和表达式
-
算术运算符:操作对象必须是变量,不能是常量或表达式。
-
后加:先运用
-
先加:先加后用
-
-
赋值运算符
-
关系运算符和逻辑运算符
-
关系运算符结果为bool类型
-
c++中非0为真
-
-
逗号表达式:最后一个逗号后的结果。
-
-
语句
-
if(a)->if(a!=0)
-
Do whlie语句至少执行一次。
-
switch不一定每一个case后面都有break(跳出当前循环语句,而不是if语句)default至多一个。
-
for循环:注意是否无限循环,循环条件的正确性。
-
-
补充
-
continue跳过剩余的语句(继续循环,不会跳出)
-
const表示某一个变量的值不会再改变,只可读,不可写
-
运算符优先级:非>与>或
-
预处理指令 #define,#ifdef
#ifdef 标识符
程序段1
#else(可以没有)
程序段2
#endif
在头文件中使用#ifdef和#ifndef可以防止双重定义的错误
-
条件编译:#ifndef,#endif
-
-
宏定义#define命令。被定义的字符串是替换文本。
-
简单:#define <宏名> <字符串>
-
带参数:#define<宏名> (<参数表>)<宏体>
-
课时二:构造数据类型
-
数组
-
数组的下标必须是常量。
-
数组未初始化,则元素的值不确定。(静态数组未初始化时默认为0)
-
#include<iostream>
using namespace std;//声明命名空间
int main()
{
int a[10]={1,2,3,4,5};
int b[4];
//b[4]={1,2,3,4};//不合法,超出下标范围
b[0]={1};
b[1]={2};
int c[10][10]={0};
int d[4][4]={1};//不是全1的数组,部分初始化
cout << "hello";
}
-
指针
-
*代表取内容,&代表取地址。
-
#include<iostream>
using namespace std;//声明命名空间
int main()
{
int a[5]={1},*p;
p=&a[0];
cout<<p<<"\n";//a的首地址
cout<<&p<<"\n";//p所存放的首地址
cout<<*p<<"\n";//p地址的内容 :a的第一个元素
cout<<*(p+1)<<"\n"; // 指针的遍历:a的第二个元素
}
-
动态内存分配:
-
new是分配,delete是释放。(运算符)
-
C语言中,malloc和free是函数。分配前需要大小。
-
new使用的时候可以同时进行初始化。
-
-
引用
-
Int r,&rv=r,别名和目标名公用内存,(rv和r)
-
类型必须一致,必须立即初始化。
-
不能中途换名。
-
数组的引用:int a[5]={0};(&rv)[5]=a;
-
-
字符串
Char s[20]="c++程序设计",*p=s;
sizeof(s)->char只占一个字节,结果为20.
sizeof(p)-指针占4个字节
strlen(s)结果为11,汉字占两个字节。
String
-
String a="men",b="kind";
-
可以当做数组看,a[1]='e'
-
可以连接:c=a+b则c="mankind"
-
可以相互赋值:a=b则a="kind"
-
以上最后两条都是字符型数组不能实现的
-
-
其他类型
-
枚举类型:enum
-
enum season
{
spring,
summer,
autumn,
winter
};
season s=winter->s=3;
//如果让spring=1,后面依次递增
-
结构体:类比类-对象
-
结构体和类的区别:
-
类:未访问的时候访问控制属性为私有类型。
-
结构体中:未定义的也是公共类型。
-
-
-
共用体:union
-
当数据使用两种或更多种格式(但不会同时使用)时,可以节省空间。
-
若干个成员中,其中占用内存最大的座位共用体类型的大小(不是相加)
-
-
补充
-
Char name[20]输出就是内容
-
Int name[20]输出的是首地址
-
课时三:函数
-
认识函数
-
声明:int add(int a,int b);形参不占用空间,可以省略a和b。
-
函数不能嵌套,但是可以相互调用。
-
-
简单函数
-
递归函数:对时间和空间需求大
-
内联函数:以时间换空间:inline
-
系统函数:sqrt,fabs,rand
-
函数重载:功能相似。
-
函数同名,但是函数的参数类型、个数或者顺序不同
-
函数的返回值类型不能作为函数重载的区分条件。
-
-
-
函数和数组
-
计算一个数组的所有元素之和,要求采用调用函数的方式
-
#include<iostream>
const int Arsize=8;
int sum_arr(int arr[],int n);
int main()
{
using namespace std;
int cookies[Arsize]={1,2,4,8,32,64,128};
int sum=sum_arr(cookies,Arsize);
cout<<sum<<"\n";
return 0;
}
int sum_arr(int arr[],int n)
{
int total=0;
for(int i=0;i<n;i++)
total=total+arr[i];
return total;
}
-
数组名代表的是数组的第一个元素的地址,cookies=&cookies[0]
-
上述元素穿入的第一个参数为地址,可用指针来表示int *p(只在函数头中生效)
-
数组作为参数意味着什么:没有传入数组中的内容,只是传入了数组的地址,数据的类型和个数。
-
指针和const:
-
让指针指向一个常量对象,此时指针不能修改所指向的值。
-
-
函数和二维数组:
-
二维数组如何调用:int total=sum(data,3); 第二个参数传递的是第几行----传入了几个一维数组。
-
函数的声明:int sum(int(*ar2)[4],int size);-----4是传入的一维数组的元素的个数。
-
Int sum(int ar2[][4],int size);
-
-
-
其他
-
auto为自动变量,存放在动态存储区,可省略。
-
extern是外部变量,定义在函数体(包括main函数)之外,是全局变量。
-
static是静态变量,未初始化时为0.
-
课时四:类与对象
-
认识
-
类不占用内存空间
-
对象是类这种数据类型的变量
-
类的作用:c++通过类来实现封装,类是由用户定义的数据类型。(数据隐藏)
-
在类体中不能对数据成员进行初始化(因为没定义对象)
-
-
类成员
-
private(私有成员)
-
protected(保护成员)
-
public(公有成员),定义了类的外部接口,允许派生类访问
-
成员函数类内声明->settime(int a=0,int b=0){}
-
类外的定义:void clock::settime(int a=0,int b=0){}
-
类声明
-
构造函数与析构函数
-
构造函数:
-
是一个与类同名的成员函数,没有返回值,定义为公有函数,只能在定义对象时被系统内自动调用。
-
类中可以有多个构造函数,构造函数可以被重载,可以是内联函数。
-
带默认参数的构造函数。
-
复制构造函数:Clock(Clock &C).
-
没有对象时,不会调用构造函数。
-
使用
-
-
析构函数:
-
~Clock()->()不能由参数
-
析构函数属于公有成员,不能重载,但可以是虚函数。
-
当对象被删除或者程序结束时,自动调用析构函数。
-
一般,调用几次构造函数就按照相反顺序调用几次析构函数。
-
-
友元:friend
-
实现不同类的数据共享。
-
友元函数:不属于类的成员函数,可以访问类的所有成员。
-
友元类:class a{...friend class b;...}b是a的友元类,b可以访问a的所有成员。
-
友元不能传递且是单向的。友元关系不会被继承。
-
-
其他
课时五:继承与派生
-
继承
-
若省略继承方式,则默认为私有继承。
-
派生类继承了基类除去构造函数和析构函数之外的全部数据成员和函数成员。
-
同名覆盖:派生类中的新的同名函数覆盖基类的函数。
-
继承方式:基类中的成员将在派生类中有的访问权限。
-
-
派生
-
派生类存储了基类的数据成员。
-
派生类对象可以使用基类的方法。
-
派生类需要自己的构造函数。
-
派生类可以添加额外的数据成员。
-
-
派生类的构造函数与析构函数:
-
派生类也要初始化基类成员
-
派生类定义对象时,构造函数调用顺序:先基类-内嵌对象--最后派生类
-
-
继承的格式:
保护成员在派生类内可以被访问,私有成员无论类内还是类外都不可以被访问。
-
其他
-
若基类中构造函数有默认值,则派生类不必再给基类传递数据。
-
基类与派生类的赋值兼容
-
派生类的对象可以赋值给基类对象
-
同一基类的不同派生对象不能相互赋值。
-
-
派生类可以对基类进行操作->即基类=派生类的操作是对的,反之都是错的。
-
课时六:多态性
-
函数重载和运算符重载
-
相关概念
-
指定多个定义
-
重载声明:重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它们的参数列表和定义(实现)不相同。
-
重载决策:选择最合适的重载函数或重载运算符的过程,称为重载决策。
-
-
-
可重载运算符:
-
不可重载:
-
规则和限制:
-
对已有的运算符进行重载。
-
重载不改变运算符的优先级、结构、操作个数--只改变功能。
-
重载函数不能有默认参数。
-
-
虚函数
-
当基类的指针指向派生类实例时,可以用基类指针调用派生类中的成员函数;
-
若基类指针指向不同的派生类时,则该指针可以调用同一个函数实现不同的逻辑.
-
虚函数可以使基类中的函数”隐藏起来”,从而使指针指向派生类的同名函数
-
只有类的成员函数才能是虚函数(构造函数不行,析构函数可以),非成员函数都不行,内联函数不行,静态函数不行
-
纯虚函数和抽象类
-
首先:强调一个概念定义一个函数为虚函数,不代表函数为不被实现的函数。定义他为虚函数是为了允许用基类的指针来调用子类的这个函数。定义一个函数为纯虚函数,才代表函数没有被实现。
-
定义:纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加”=0”
virtual void funtion1()=0
-
抽象类的介绍抽象类是一种特殊的类,它是为了抽象和设计的目的为建立的它处于继承层次结构的较上层。
-
(1)抽象类的定义:称带有纯虚函数的类为抽象类
-
(2)抽象类的作用:将有关的操作作为结果接口组织在一个继承层次结构中,由它来为派生类提供一个公共的根派生类将具体实现在其基类中作为接口的操作,
-
使用抽象类时注意: a、抽象类只能作为基类来使用,其纯虚函数的实现由派生类给出。如果派生类中没有重新定义纯虚函数,而只是继承基类的纯虚函数,则这个派生类仍然还是一个抽象类。
如果派生类中给出了基类纯虚函数的实现,则该派生类就不再是抽象类了,它 是一个可以建立对象的具体的类。
-
抽象类不能定义对象。