C++基础语法
1.相对C的特性C语言适合处理较小规模的程序,对大规模程序,C语言并不适合。
2.命名空间:用于解决符号名称冲突的方法
定义:namespace<名字>{<代码>},局部引用<名字>::<函数名/变量名/类名> 全局引用using namespace <名字> , ::域操作符(用于访问作用域)
命名空间取别名 namespace <name1> = <name2>; 匿名命名空间:定义自己的命名空间时不需要取名字,可直接使用里面的函数或变量,但只在当前文件内生效
3.输入输出cin>> ;cout<<;
4.C++中的函数1带默认值的函数void show(int i = 0)即使不传参也会按默认值参数运行,只有部分参数有默认值时,带默认值的参数必须放在参数栏末尾。默认参数只需要在声明或定义时说明,不需要两者都说明。带占位参数的函数为了扩展功能,可以给他带默认值void show(int i,int j,int = 0)不写变量名
!!函数重载:提高函数的易用性 规则:1.函数名必须相同2.参数列表必须不同(个数不同,类型不同)
5.C++引用(简化指针操作)概念:引用是给一个变量或对象取别名,对引用操作与对其绑定对象操作一样。<类型> &<引用名> = <目标变量或对象名> eg:int b = 10; int & a = b(创建时初始化); a = 20; 声明引用时必须同时初始化,且初始化后不能改变引用空间的位置 ,引用类型必须与目标变量或对象类型一致 ,不能将已有引用名作为其他变量或对象的名字或别名 。使用引用时编译器会在底层生成一个指针,并自动进行*运算。本质是指针常量的使用: int* const p;主要用于函数传参。用于函数返回 返回的数据必须为静态变量 。引用返回,函数可以为左值也可以为右值。
对数组的引用 int arr[5] = {1,2,3,4,5} int(& refarr)[5] = arr; refarr[0] = 6; 对指针的引用int num = 100;int *p = # int *&refp = p ;*refp = 1000;
6.new与delete类似malloc 与 free ,new申请内存并初始化对象,delete释放内存并销毁对象 。int *p = new int ,delete p;申请对象并释放,int * p = new int[5];delete[]p;申请对象数组并释放。
与malloc和free的区别 malloc/free是C/C++标准库函数,new/delete是C++操作符,malloc需要手动计算类型大小返回void*,new可以自己计算类型大小,根据类型返回相应的类型指针,malloc/free只负责分配/释放空间,new/delete会调用构造函数和析构函数,用于初始化和销毁对象
C++面向对象封装
1.类(数据类型,用于描述一个类事物,包括属性和方法)和对象(具体化某一事物,成为具体个体,创建后回分配内存空间)class A{};,A a; A*a = new A();delete a;动态创建对象。
2.访问权限,class默认权限为private ,public,private,protected。
3.构造函数:在构造对象时自动调用该函数,往往用来初始化对象内成员变量。函数名与类名一致且没有返回值,class A{ A(){} };当类中没有定义构造函数时,编译器会自动生成一个构造函数。构造函数可以重载。A(); A(int a); A(int a,int b); 初始化列表:在初始化时,可以使用初始化列表的方式来实现构造函数,一般在继承中A(int _x,int _y) :x(_x),y(_y)。拷贝构造函数:主动创建对象时,用一个对象去初始化另一个对象时,一个对象以值传递的形式传入函数体时,一个对象以值的形式从函数中返回时(关闭优化)。浅拷贝(默认的拷贝构造函数为浅拷贝,针对指针对象只拷贝指针存储的地址不拷贝空间)与深拷贝(针对指针对象,拷贝指针指向空间),explicit关键字只能用来修饰类的构造函数,且最好修饰只有一个参数的构造函数,被修饰的构造函数不能发生隐式类型转换。
4.析构函数:在销毁对象时自动调用该函数,往往用来释放对象申请的资源。与类名相同在前面加位取反符~且不能有任何参数和返回值~A(){}。特点:没有参数和返回值但有this指针,析构函数不能用const修饰,一个类有且只有一个析构函数
5.static:静态关键字用于修饰成员变量和成员函数。静态成员可以通过::来使用<类名>::<静态成员名>。修饰静态成员在类内声明static<类型修饰符> <变量名> 类外初始化 <类型修饰符><类名>::<变量名> = <初始化值>。特点:static修饰成员变量属于类不属于具体对象,static成员变量的内存在程序开始运行时分配,在程序结束时释放,static成员变量对于所有的对象是共享在对象创建之前就产生,静态成员使用前必须初始化否则会在linker报错,在成员函数中可以正常访问静态成员变量。 修饰成员函数static<函数返回值> <函数名> (参数列表) 特点:可以被对象直接使用,可以通过类名直接访问,不能使用this指针,与类关联,不与对象关联,在调用静态函数时可以在没有对象时调用 !!不能访问非静态成员,只能访问静态成员。在一切不需要实例化(创建对象)就可以有确定行为方式的函数都应该被设计位静态的
6.const关键字:(常量)只读,const成员变量只能在初始化列表中初始化不能在构造函数内进行初始化,const修饰成员函数放在函数末尾,防止成员函数修改非静态成员变量的值,const成员函数可以修改静态成员变量的值,const成员函数可以与同名非const成员函数构成函数重载,创建const对象时调用的位const修饰的成员函数
7.友元:友元函数不是成员函数,它定义在类外部,只需要在类中声明。友元函数可以访问所有四月成员和保护成员friend<函数声明> 友元类一个类是另一个类的友元friend<类名>,友元是单向性,友元不能被继承,友元没有传递性
8.运算符重载:实际上是对运算符赋予新的运算方式 目的:使对象的运算操作更加简洁明了,规则:大部分都可以重载少部分不行(. .* ->* :: sizeof ?: #),重载运算符无法改变运算符优先级,无法改变运算符结构性,无法改变运算符所需操作数,无法创建新的运算符 类的成员函数<函数返回值>operator<运算符>(<形参表>){<函数体>}。类的友元函数friend<函数返回值>operator<运算符>(<形参表>){函数体} class Mysring{}; Mystring operator +(const Mystring &other); 前置++ Mystring& operator++(); 后置 Mystring operator++(int) friend ostream &operator << (ostream &out , const Mystring &other);
9.内联函数 目的:解决程序中函数调用效率问题 原理:内联函数编译器阶段复制镶嵌到主函数中,语法不能使用循环和开关语句不能超过10行,声明和定义必须在同一文件,声明时加inline修饰符
C++面向对象继承
1.继承:从已有类创建新类的过程,使得创建和维护一个应用程序变得更加容易,达到看重用代码功能和提高执行时间效果 语法: class<派生类名> :<权限访问限定符> <基类名1> ,<权限访问限定符><基类名2>{} 公有继承,私有继承,保护继承。无法被继承的成员:基类的构造函数,拷贝构造函数和析构函数,基类的重载运算符,基类的友元函数。
继承后成员函数的隐藏:父类和子类有同名函数,调用时总是调用子类的函数,此时父类成员函数被隐藏,一般子类继承过来的函数不适合子类,需要扩展,则需重写父类的函数,函数的返回值和参数可相同可不同
构造函数调用顺序定义出一个派生类时 先调用基类构造函数(继承顺序),再调用成员对象构造函数,最后调用派生类本身的构造函数 析构函数调用顺序与构造函数相反 多继承C++中允许派生类拥有多个基类 多重继承派生类继续派生一个类(菱形继承问题):数据冗余问题,二义性问题解决方案使用虚继承virtual
5.C++面向对象 多态
1.多态:对于同一个行为对于不同的对象,有不同的表现是面向对象编程的三大特性之一(封装,继承,多态),C++一般针对一个行为只会有一个名称,是对类的行为再抽象,主要作用与统一行为的接口,提高方法的通用性。多态在C++中分为静态多态(基于函数重载和泛型编程)和动态多态(基于虚函数)。
2.静态绑定与动态绑定:静态绑定是指程序编译结束后就确定了需要调用的函数。动态绑定是指在运行时才确定具体需要调用的函数。作用:把不同的派生类对象都当作基类对象来看可以屏蔽不同子类对象之间的差异,提高程序的通用性来适应需求的不断变化!!C++中允许父类的指针或引用指向子类的对象A *a = new B ; B b; A &a = b;
3.虚函数与动态多态的实现 虚函数:使用virtual关键字声明的函数,是实现动态多态的基础,非类的成员函数不能定义为虚函数,类的静态函数构造函数不能定义为虚函数,但通常将析构函数定义为虚函数,防止通过父类指针指向子类对象时子类内存未释放而可能造成内存泄漏,将基类的某一成员函数声明成虚函数后派生类的同名函数自动成为虚函数。实现1.创建两个类且为继承关系2.基类中函数声明为virtual函数 3.派生类继承基类并重写基类中虚函数4.通过基类指针或引用访问派生类对象
4.覆盖(重写) 、重载、隐藏。成员函数覆盖:定义派生类重新实现基类的虚函数,特点:不同作用域(基类和派生类)函数名相同 参数相同 返回值相同 基类必须有virtual关键字,不能有static修饰 重写函数的权限访问限定符可以不同 函数重载同一作用域函数名相同参数不同返回值可相同可不同,隐藏:不同作用域函数名相同参数不同时无论有无virtual关键字,基类函数将被隐藏,参数相同时,但基类没有virtual关键字,基类函数将被隐藏
5虚函数原理与虚函数表 原理:C++能在运行时确定调用的函数是因为引入了虚函数,一旦引入了虚函数,在编译期间就会创建虚函数表,表中没一项数据都是虚函数的入口地址
6.抽象类与纯虚函数,抽象类:含纯虚函数的类,抽象类只声明函数接口不能有具体实现,抽象类不能创建对象,可以定义指针与引用,派生类继承基类,必须实现基类中所有纯虚函数否则也是抽象类 纯虚函数:指定函数接口,而不做具体实现,实现部分由子类实现 virtual void show() = 0 ;