代码改变世界

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

2012-07-28 22:48  javaspring  阅读(196)  评论(0编辑  收藏  举报

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中的所有成员变量和成员函数(包括私有成员)