面向对象----类基础知识

来源:互联网 发布:单片机学习网站 编辑:程序博客网 时间:2024/06/05 15:55

1、static和const变量

     static变量是类的所有对象所共享的,他必须在类的外面定义和初始化,计算类的内存大小时不用考虑static变量

     const变量只能在类的初始化函数列表中进行初始化

     const static变量一般在类的外面定义和初始化

2、空类的大小是1

     空类的大小是1,那是被编译器插进去的一个char ,使得这个class的不同对象在内存中配置独一无二的地址,也就是说这个char是用来标识类的不同对象的

3、构造函数和析构函数

     基类中只要类中提供了任意一个构造函数,那么c++就不在自动提供默认构造函数

     派生类中的构造函数必须要初始化基类中的成员数据,这通常是调用基类的构造函数来完成的

     类成员的构造是按照在类中定义的顺序进行的,而不是按照构造函数说明后的冒号顺序进行构造的

#include <stdio.h>  #include <stdlib.h>#include <iostream>#include <math.h>using namespace std;class B{    float x;public:       B(float a) {x=a;  cout<<"调用构造函数\n";}    ~B()   {  cout<<"调用析构函数\n";}    void Print(void) {cout<<x<<endl;  }};void main(void){    B  b1(1.0) ;//调用构造函数    b1.Print();      B  b2=100;      //调用构造函数    b2.Print();      b1=10;        //调用构造函数产生一个临时对象B(10)赋值给b1,然后调用析构函数析构该对象    b1.Print();    cout<<"退出主函数\n";}
#include "stdafx.h"#include <iostream.h>#include <string.h>class B{public:B(){cout<<"default constructor"<<endl;}B(int i):data(i)    {cout<<"constructed by parameter" <<data<<endl;}B(const B&b){cout<<"copy constructor"<<endl;}~B(){cout<<"destructed"<<endl;}private:int data;};B Play(B b){    return b ;}void main(){B t1=Play(5);    //Play函数形参调用带参数构造函数生成临时对象,Play函数返回时调用复制构造函数,Play函数形参析构B t2=Play(t1);   //Play函数形参调用复制构造函数生成临时对象,Play函数返回时调用复制构造函数,Play函数形参析构B t3=Play(10);   //Play函数形参调用带参数构造函数生成临时对象,Play函数返回时调用复制构造函数,Play函数形参析构//析构t1,析构t2,析构t3}

4、深拷贝和浅拷贝(类含有指针类型的成员)

     深拷贝:拷贝的是指针地址所指向的变量

     浅拷贝:拷贝的是指针地址   //类似int *p1=p2;两个指针指向同一块内存,当删除一个指针时,另外一个指针指向的对象也随之删除

5、复制构造函数

     A a(b); 会调用类的复制构造函数

     编译器通常会为类合成默认复制构造函数,但是当类中定义了指针类型的成员时,我们必须定义自己的复制构造函数以实现深层拷贝

6、无名对象

     A(10)就会产生一个无名对象

     A a=A(10);  //利用无名对象初始化对象系统不会不调用拷贝构造函数

7、类的静态成员和静态函数

     静态函数中只能访问静态成员和静态函数,而不能访问非静态成员和成员函数,因为静态函数中没有this指针。

8、友元类

     在类A中声明友元类B,则在类B中可以访问类A中的所有成员变量和成员函数(包括私有成员)