运算符重载的三种方式?
答:普通函数,友元函数,类成员函数。
对象间是怎样实现数据的共享的?
答:通过类的静态成员变量来实现对象间的数据共享。
静态成员变量占有自己独立的空间不为某个对象所私有。
静态函数存在的意义?
答:静态私有成员在类外不能被访问,可通过类的静态成员函数来访问;
当类的构造函数是私有的时,不像普通类那样实例化自己,只能通过静态成员函数来调用构造函数。
函数重载是什么意思?它与虚函数的概念有什么区别?
函数重载是一个同名函数完成不同的功能,编译系统在编译阶段通过函数参数个数、参数类型不同,函数的返回值来区分该调用哪一个函数,即实现的是静态的多态性。
但是记住:不能仅仅通过函数返回值不同来实现函数重载。
虚函数实现的是在基类中通过使用关键字virtual来申明一个函数为虚函数,含义就是该函数的功能可能在将来的派生类中定义或者在基类的基础之上进行扩展,系统只能在运行阶段才能动态决定该调用哪一个函数,所以实现的是动态的多态性。它体现的是一个纵向的概念,也即在基类和派生类间实现。
虚函数是怎么实现的?
虚函数是一种实现多态的机制,它可以让基类的指针或引用根据实际指向的对象类型来调用相应的成员函数。虚函数的实现原理是通过虚函数表和虚函数表指针来实现的。
每个含有虚函数的类都有一个虚函数表,存储了该类的所有虚函数的地址。
每个含有虚函数的对象都有一个虚函数表指针,指向该对象所属类的虚函数表。当通过基类的指针或引用调用虚函数时,程序会先通过虚函数表指针找到虚函数表,然后再通过虚函数表找到对应的虚函数地址,最后调用该地址所指向的函数。这样就实现了动态绑定,即在运行时根据对象类型确定调用哪个函数。
在什么时候使用常引用?
答:如果既要利用引用提高程序的效率,又要保护传递给函数的数据不在函数中被改变,就应使用常引用。
类的声明和实现的分开的好处?
1. 起保护作用;
2. 提高编译的效率。
1.随机数种子srand((unsigned int) time (NULL)); int num=rand()%100+1; //随机数种子
2.do {} while(条件)
3.三目运算符c=(a>b?a:b);
4.goto FLAG; FLAG: //直接跳标记处
5.数组首地址(int)arr,第n个元素地址为(int)&arr[n];
6.const int *p1=&a; 指向能改 int *const p2=&a值能改 const int * const p3=&a都不能改
7.swap1(a,b); //值传递 形参改变不改变实参 swap2(&a,&b); //地址传递 会改变实参
8.for (int i = 0; i < len-1; i++) for (int j = 0; j < len-1-i; j++) 冒泡排序
9.int *p=new int(10); //在堆区创建整型数据 delete p; int *arr=new int[10]; //创建10个元素的数组delete[] arr;
函数传入数组全是整数时(int *arr,int n),传入结构体数组时(hero h[],int n)
switch结构中,如果break;上面是一行代码,没问题。如果上面有很多行代码则需要加{}构成一个代码段。
8.int &b=a; //引用用法 数据类型 &别名=原名 一旦初始化后就不能更改
9.swap2(&a,&b); 改变实参
10.//构造和析构,创建对象时自动调构造, 销毁前自动调析构,且都只调一次 //构造可以有参数,可以重载,析构不能有参数 不能重载
11.person(const person &p){ cout<<"拷贝构造"<<endl; m_age=p.m_age; } //拷贝构造函数的三种创建时机 person p2(p1) //1.使用一个已经创建完毕的来初始化一个新对象 void dowork(person p){} //2.值传递的方式给函数参数传值 person dowork2(){ person p1; return p1;}//3.以值方式返回局部对象
12.//构造函数调用规则 //默认情况下: 编译器会提供三个函数 默认构造,析构和拷贝 //如果提供了有参,就不会默认提供默认构造,但还是提供拷贝 //如果提供了拷贝 则前面两个都不会默认提供
13.深拷贝与浅拷贝:int * m_height; 用*将这个数据开辟到堆区 /堆区开辟的数据需要手动释放
所以写标准析构取释放if(m_height!=NULL) delete m_height; m_height=NULL;} 但此时会崩,因为编译器默认 拷贝的//m_height=p.height; 所以要自己实现拷贝构造解决这个浅拷贝问题person(const person &p){m_height=new int(* p.m_height);}
14.person(int a,int b,int c):a(a),b(b),c(c){} //初始化列表语法
15.//当类对象作成员时,先调用成员构造,再自身 //析构的话,先自身,再成员析构
16.static int m_a; //静态成员变量 所有对象共享一份数据,类内声明,类外初始化操作int person::m_a=100; 意思是如果某个对象把这个m_a=200;那后面任何对象访问都是200 静态成员变量有2种访问方式 (1)通过对象访问p.m_a (2)可以类名直接访问person::m_a
17.static void func(){ //静态成员函数只能访问静态成员变量,也是程序共享一个成员函数
18.成员变量和成员函数是分开存储的 static int m_b; //不属于类的对象上,所以不占空间 //c++编译器会给每个空对象也分配一个字节空间,为了区分空对象所占内存的位置
this指针的用途:1.当形参和成员变量同名时,可用this指针来区分
2.在类的非静态成员函数中返回对象本身,可使用return *this
空指针也是可以调用成员函数,但如果成员函数中用到了this指针就不行了。
19.person & personaddage(person &p){this->age+=p.age;return *this;}//this指向p2的指针,而*this指向的p2这个对象本体,值会变
20. void showperson() const//在成员函数后加const,叫常函数,修饰的是this指针,导致指向的值也不能改。mutable int m_b; //特殊变量,即使在常函数中,也可以修改这个值,加关键字mutable
const person p; //这叫常对象 在对象前+const 常对象只能调常函数,此时只能修改+mubtable的属性
21.friend void goodgay(person *p); //将全局函数 拿过来 前面加上friend 就是好朋友了
22.friend void dog::visit2(); //加上这一句 成员函数作友元 这有个细节,被访问的类在后面