面向对象----类基础知识
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中的所有成员变量和成员函数(包括私有成员)