Chinaunix首页 | 论坛 | 博客
  • 博客访问: 221426
  • 博文数量: 93
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 542
  • 用 户 组: 普通用户
  • 注册时间: 2014-12-09 16:59
文章分类

全部博文(93)

文章存档

2016年(27)

2015年(66)

我的朋友

分类: C/C++

2016-01-03 23:52:07

1.构造函数和析构函数是不能从基类继承的


2.类是没有修饰符的


3.数据成员有private protected public(若未指定,则默认为私有的)static const几种修饰符


4.成员方法有private protected public(若未指定,则默认为私有的)static virtual几种修饰符


5.继承方式有private protected public三种(若未指定,则默认为private)


6.C++标准是由C++编译系统实现的,C++编译系统同时还“提供了”以前写好的库函数和类;


操作系统API(属于操作系统的一部分,可把操作系统看做用一种或几种语言编写的一堆管理硬件和软件等计算机所有资源的代码,操作系统API也属于其中一部分)是操作系统提供的可供开发者调用的接口(一般为函数或类)


7.C++类对象所占的内存空间包括三个方面:
1.非静态数据成员所占空间总和(静态数据成员和成员方法为类的所有实例共享,不保存在某个对象实例里)
2.编译器为了CPU计算,做出的数据对齐处理
3.为了支持虚函数(虚函数表),产生的额外负担


若三个方面均未占用内存,则占用一个字节的空间


struct结构体类型变量与C++类类似,但它不必考虑函数


8.子类继承父类所有非私有的数据成员(可以覆盖)和成员函数(可以覆盖和重载),继承过来的数据成员和成员方法在子类中的访问属性根据继承方式和其原本在父类中的访问属性确定,类内部成员之间任意访问(对子类来说,只有已经继承过来的成员才属于此范围),类外部类对象只能访问类中的公有成员。


从父类中继承过来的属性的确定:


A类(基类) B类(A的派生类) C类(B的派生类)
公有继承 公有成员 公有成员 公有成员


私有成员 (无) (无)


保护成员 保护成员 保护成员


私有继承 公有成员 私有成员 (无)


私有成员 (无) (无)


保护成员 私有成员 (无)


保护继承 公有成员 保护成员 保护成员


私有成员 (无) (无)


保护成员 保护成员 保护成员




9.C++是对C的扩充,它在C的基础上加入了类(class)的概念,C++中的类可以看做结构体的延伸


10.可用friend将普通函数或成员函数声明为一个类的友元函数,也可以将一个类声明为另一个类的友元类,此时它的所有成员函数都是另一个类的友元函数,友元类之间的关系是单向的,不可传递的


11.extern


1.extern只能用于基本类型变量和普通函数,用于纯类型(包括引用类型(包括class))和引用类型变量或实例是无效的,不能用于成员函数。所以要使用其他文件中的引用类型必须用include语句包含进来


2.头文件中的内容只能被包含,不能被其他文件用extern直接引用


3.用extern引用其他文件中的基本类型变量时不可省略,引用其他文件中的普通函数时一般编译器允许省略


int e; //定义一个变量,分配存储空间,此时存储空间里面的值不可预测


extern int e; //声明e为其它文件里的变量,当其它文件里没有时,若使 //用到则报错,未使用到不报错

extern int e = 0;  //定义一个变量,分配存储空间,此时存储空间里面的值为     //0,且此变量可被其它文件引用  


12. .NET框架包括两个主要组件:公共语言运行库(简称CLR)和.NET框架类库。它的作用类似于Java的虚拟机


13.标准C++语言(ISO/IEC C++)采用完全编译工作方式,被编译成本机代码,直接运行于本机之上(不同的编译器可能实现的标准C++内容不同,有的未完全实现,有的加入了一些标准之外的新功能,但此时它们都是“本地C++”)


C++/CLI(CLI,Common Language Infrastructure,通用语言基础结构,是CLR的一部分)它开发的程序在CLR下运行,即它先被编译成CLR下能识别的格式的代码(MSIL码),再由CLR解释在本地机器上运行。它和标准C++的本质区别是编译和执行方式,当然语法特性上也会有不同或扩充


14.C++中类的前面可以有修饰符public private protected friend const static extern,其中const static extern无任何意义


数据成员前面可以有修饰符public private protected const static(普通函数中可以用extern引用其他文件中的全局变量)


成员方法前面可以有修饰符public private protected friend const static  virtual extern(extern只可用于普通函数,而不能用于成员函数),其中const置于函数名前时无任何意义,置于函数名后(这种用法只能是类中的成员函数,不能是普通函数)时,意味着此函数体中只能访问数据,而不能直接或间接地修改数据


15.用提前引用声明使引用类型(只有类型有必要)可见时,只能用其定义指针或引用,因为指针和引用所需存储空间大小是固定的,不能用来创建对象,也不能用来调用静态数据成员或成员方法


16.构造函数(类对象的初始化)

若类中只含公共数据成员且没有自定义构造函数时(无论有参数的或无参数的),则可像初始化结构体变量一样初始化类对象,此时类中的默认构造函数未执行

可以用相同的类对象或子类对象初始化类对象,此时类中的构造函数未执行(可以有自定义构造函数)


构造函数名必须与类名相同,它不具有任何类型,不返回任何值,自定义的构造函数必须声明为public;构造函数不需要也不能被用户调用(如t1.Time();是错误的)


一般认为在无自定义构造函数的情况C++系统提供一个默认的构造函数(因为可以显示调用默认的构造函数)


分配空间到栈的实体,必须先初始化使其有值(有具体非零值 零值 随机值三种情况)后才可使用,否则会出错


有自定义构造函数的类在创建对象时调用一次自定义构造函数;无自定义构造函数的类在创建对象时可以显示调用默认构造函数,若未显示调用默认构造函数则有些情况下会自动调用默认构造函数,有些情况下则不会


自定义构造函数一般形式:
构造函数名([参数表])[:成员初始化表]
{
[构造函数体]
}


其中成员初始化表中不能包含数组;
给构造函数形参指定默认值时,若函数的声明和定义分开,此时对同一个形参只能在一处指定默认值,一般在函数声明时给出,在函数定义时不再给出;
使用类创建对象时,若调用有了有参构造函数,必须保证构造函数的所有形参有值;
一般不同时使用构造函数重载和有默认参数的构造函数,因为这时很容易出现歧义性错误


17.析构函数


先构造后析构


当对象的生命周期结束时,会自动执行析构函数,构造函数和析构函数的调用情况如下:


1.全局对象在程序开始时分配存储空间到堆(未初始化的分配到.bss段,已初始化的分配到.data段),此时调用其构造函数(即在所有函数(包括main函数)执行之前调用),在程序结束时释放其存储空间,并在这之前调用其析构函数。当一个程序包含多个文件,而在不同文件中都定义了全局对象,则这些对象的构造函数的执行顺序是不确定的
2.动态局部对象在其所在函数被调用时分配存储空间到栈,此时调用其构造函数,函数调用结束时释放其存储空间,并在这之前调用其析构函数。其所在函数再次被调用时重复上述过程
3.静态局部对象在其所在函数第一次被调用时分配空间到堆(未初始化的分配到.bss段,已初始化的分配到.data段),此时调用其构造函数,函数调用结束时并不释放其存储空间,在程序结束时才释放其存储空间,并在这之前调用其析构函数。所以第二次调用其所在函数时并不会重新再分配存储空间
4.用new运算符创建的对象分配存储空间到堆(即使是在函数被调用时在函数内创建的,同样还是动态的分配存储空间到堆,并且函数调用结束时不会自动释放存储空间,必须要用delete运算符显示释放此存储空间),此时调用其构造函数,用delete运算符释放此存储空间前调用其析构函数


析构函数的作用并不是删除对象,释放其所占的存储空间,而是在撤销对象占用的内存之前完成一些清理工作


析构函数不返回任何值,没有函数类型,也没有函数参数。由于没有函数参数,因此它不能被重载,自定义析构函数必须声明为public。一个类可以有多个构造函数,但只有一个析构函数


若无自定义析构函数则C++系统提供一个默认的析构函数,在类对象生命周期结束前自动调用其析构函数


18.派生类的构造函数和析构函数

构造函数的初始化表只可以出现在构造函数的定义部分,而不能出现在声明部分

构造函数可以在类创建对象和类(可以是毫不相干的类)内部中被调用(即使可能构造函数中有对本类中私有的,其它类(包括其子类)中不可见的数据或方法的访问),但不能用类对象显式调用


若类的构造函数是有形参的,则其子类的构造函数在初始化表中必须包含父类的构造函数(此时若子类中无构造函数,则不能创建子类对象),若是无形参的,则初始化表中可以不包含父类的构造函数,此时默认包含(此时子类中可以没有构造函数)


在类中定义一个自定义类对象,无论类的构造函数有无参数,声明类对象时都不能带参数,如果类的构造函数是有参数的,则此类的构造函数初始化表中必须包含类对象(此时若类中无构造函数,则不能创建此类的对象),若是无形参的,则初始化表中可以不包含类对象,此时默认包含(此时此类中可以没有构造函数)


19.虚函数和抽象类


若继承方式为非公有继承,则子类不能自动转换为父类,如:parent = &child;和(Parent)child;


子类对象转换为父类对象后,对父类中成员的访问是根据原父类中的访问属性进行的,而不是根据继承后子类中的访问属性


子类对象直接转换为父类不能实现虚函数多态,((Parent)child).fun1();

动态的创建一个子类的对象,并使其父类指针指向这个对象,则在释放这个指针指向的空间的时候,当父类的析构函数是非虚函数时调用的析构函数是父类的,所以要避免这种情况就必须将父类析构函数声明为虚函数


只给出声明不给出定义的虚函数即为纯虚函数,一般形式为:
virtual 函数类型 函数名(形参列表) =0;
如果在子类中仍然没有定义父类中的纯虚函数,则此纯虚函数在子类中仍为纯虚函数
包含纯虚函数的类不能创建对象,称为抽象类,即抽象类不能实例化,但可以定义指向抽象类类型的指针
虚基类是用来避免多重继承中对父类的重复继承问题的,而与多态性无关








虚函数和抽象类 引用 数组和string 运算符重载
static方法和数据
阅读(1367) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~