此文本 为自己学习c++时的上课笔记 排版很乱 不过一行一行看 还是没有问题的,,不喜勿喷
引用 & 只是给变量起别名,没有生存内存空间,不占内存,传址不传值。经常和const连用 const 修饰的变量还是变量 只是变量不可改变。const 在数据类型前后没有影响。const int == int constint const *p 修饰的是*p的值 即*p 不可变,指针指向的数据不能变 指针地址可变。int * const p 修饰的是指针p 即指针指向不能变。而指向的内容可以变。即const在*的左边,则指针指向的变量的值不可变;在*的右边,则指针的指向不可变。简记为“左定值,右定向”。int
const * const p 是指 指针和指向的数据都不能变。const 与后面的结合只修饰后面的变量,一个简单的判断方法:指针运算符*,是从右到左,那么如:char const * pContent,可以理解为char const (* pContent),即*pContent为const,而pContent则是可变的
例二
int const * p1,p2;p2是const;(*p1)是一整体,因此(*p1)是const,但p1是可变的。int * p1,p2只代表p1是指向整型的指针,要表示p1、p2都是指针是需写成int * p1,* p2。所以无论是* const p1,p2还是const * p1,p2,里面的*都是属于p1的。
例三
int const * const p1,p2;p2是const,是前一个const修饰的,*p1也被前一个const修饰,而p1被后一个const修饰
。
例四
int * const p1,p2;
p1是const,(* const p1)是整体,所以const不修饰p2。
例五
指针指向及其指向变量的值的变化
const在*的左边,则指针指向的变量的值不可变;在*的右边,则指针的指向不可变。简
记为“左定值,右定向”。
静态函数可以在类中声明并且实现,,,也可以响应的源文件。cpp文件中实现。不过要加类域void Person:: getName(){return m_name;}静态成员函数 只能访问静态成员量。一般成员函数可以访问所有的成员变量包括静态成员变量。。静态成员函数不能访问一般成员函数 静态成员函数只能访问静态成员函数。。在主函数的实用 加上类域 Person ::函数名即可,也可以用类对象引用 ,但是静态成员函数不属于任何类对象 没有this指针 是类对象共享的 一个对象改变静态变量 其他的也都改变了。。
常成员函数可以访问非常成员变量 常成员变量必须在构造函数的初始化列表中初始化 常成员函数可以访问常成员函数 常成员函数不能访问非常成员函数 非常成员函数可以访问常成员函数成员函数的形式 函数声明后加 const 即 void getname()const {return m_name ;}可以在类里面实现 也可以在。cpp源文件中实现 不过要加类域::
const类对象不能调用非const成员函数,可以调用类的const成员函数
继承
子类不能从父类继承的有:
1. 构造函数
2. 拷贝构造函数
3. 析构函数
子类能从父类继承的有:
1、静态成员变量
2、静态成员函数
3、友元函数
4、赋值操作符=重载函数
公有继承
class Person
{
。。。。。
}
class Chinese :public Person
{
。。。。。
}
在类内 子类的成员只能访问父类的公共区 保护区的成员
一个类的私有区成员 只有自己可以访问 继承是不可以访问 私有区的内容不能被继承
一个类的保护区成员 只有自己可以访问 继承是可以访问 保护区的内容能被继承
在类外 子类的对象只能访问父类的公共区的成员,不能访问父类保护区和私有区的成员
保护继承
在类内 子类可以访问只能访问父类的公共区 保护区的成员
在类外 子类对象 什么都不能访问 包括公共区 保护区 私有区成员
私有继承 是默认继承方式即 继承是不提示继承方式
在类内 子类可以访问只能访问父类的公共区 保护区的成员在类外 什么都不能访问。。。子类中的成员函数与父类的成员函数同名的话 如果声明子类对象 会隐藏父类的同
名函数 调用子类的同名函数指针若指向子类 谁声明的指针就调用谁的成员函数 父类的指针就调用父类的成员函数 构造函数 先调用父类的 在调用子类的 析构函数 相反
调用子类有参构造函数 如果父类没有有参构造函数 就调用父类的无参构造函数 如果有的话 需要在子类的有参构造函数显示构造父类的有参构造函数 声明子类对象时才可以调用父类的有参构造函数 再调用子类的有参构造函数 在子类的有参构造函数后面 :把子类的初始化列表放在后面类的组合和继承 一起 组合类在子类中 先父类 后组合的类对象子类的析构函数
例如
class Person{};
class car{};
class china :Person
{
car t_car1
}
先Person 后car1 后china 的构造函数
this -->
Person
china
二级公有继承 子类的子类的对象在类外可以访问公有区的成员
二级私有继承 在类外类对象只可以访问公有成员
一级是私有继承 二级是公有继承 子类的子类不能访问基类的所有成员
多重继承 构造函数调用顺序以继承时先后顺序相同。。
两个父类的成员相同的时候需要显示在添加 类域
虚基类解决父类和爷爷类的变量重名问题
公有继承赋值兼容规则
1 可以将派生类对象赋值给基类对象(只是把子类的数据赋值给父类 父类并不能访问子
类的成员)
2 可以用派生类的对象初始化基类的引用
3 可以用基类的指针指向派生类的对象的地址· 父类指针只能访问父类的成员 不能访
问子类的成员( 语法检测不通过 )
子类指针指向父类对象的地址时要强制转换 子类指针 =(子类指针类型)&父类对象 此时子类指针可以访问父类的成员 可以访问子类的成员但是可能会发生内存错误 (运行时报错 编译不报错)
函数传参 参数是谁的构造函数就是谁的
函数参数传引用时不调用构造函数 效率提高
虚函数
满足动态联翩的条件1 用父类的指针或引用调用函数 2 被调用的函数是虚函数(跟虚函数所在区间没关系)
对象调用的时候如果虚函数在保护或者私有区 是不能调用的 不是动态联翩 虚函数表在子类按需要选择 覆盖 (重写虚函数)用类的对象调用函数是属于静态联翩
父类指针调用子类对象的用法
多重继承的虚函数表
。。。。。。。。
。。。。。。。。
。。。。。。。。
虚函数必须存在对象里 存在对象的虚函数表里
有一个纯虚函数的类就叫做抽象类
他的子类也是抽象类 因为他们会继承该纯虚函数
需要在子类中必须实现纯虚函数 就可以实例化对象了 不然不可以实例化对象】
纯虚函数可以用指针调用传参
纯虚函数只是一个接口 供 子类实现之后去调用
但是纯虚函数必须要用对象去调用 因为他是也虚函数所以在派生类里必须要实现抽象类不能实例化该类的对象
父类的析构函数成为虚函数 那么他的所以的子类的析构函数都是虚函数 用指针调用的时候 可以deleted 父类 子类的 deleted 父类的析构函数设置成虚的函数
模版template在函数中的使用方法
template<typename T1, typename T2>
T1 & Max(T1 & t_st1,T1 &t_st2,T2 &t_t1)
{
if(t_t1)
{
return t_st1 > t_st2 ? t_st1:t_st2;
}
}
int main()
{
int a =10;
int b =20;
char *p;
cout <<"template<int,int>"<<Max(a,b,p);
double x = 10.0;
double y= 4.5;
cout<<"template<double ,double>"<<Max(x,y,p);
}
template在类中的用法
template<typename T1,typename T2>
class student
{
public:
......
T1 & getName(){return m_name;}
T2 & getAge();
private:
T1 m_name;
T2 m_age;
}
每个实现方法都要template<typenameT1,typenameT2>
在类外实现getAge()函数的方法
template<typename T1 ,typename T2>
T2 & student<T1,T2>::getAge()
{
return m_age;
}
在主函数中实用的方法,只要在构造对象或指针的时候加上类型就可以啦。
student<string,Int> t_student1;
cout<<t_student.getAge<<endl;
指针拷贝不会调用构造函数
输出操作符的优先级大于选择操作符
覆盖是指派生类函数覆盖基类函数,特征是(1)不同的范围(分别位于派生类与基类);(2)函数名字相同;(3)参数相同;(4)基类函数必须有virtual 关键字。“隐藏是指派生类的函数屏蔽了与其同名的基类函数,规则如下(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(别与重载混淆)。(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)
显式调用父类的有参构造函数的方法
Person(const string &t_name,const string &t_nation,int t_age,int t_weight)
:m_name(t_name),m_nation(t_nation),m_age(t_age),m_weight(t_weight)