初探C++学习笔记

来源:互联网 发布:php时间戳转换工具 编辑:程序博客网 时间:2024/06/05 17:15

C++作为C语言的扩充以及进阶版,作为一种OOP语言,C++中的概念有类、对象、抽象、封装、继承、以及多态。

为大型程序的编写带来便利,也对学习提出了要求。

所谓面向对象的思维,也就是程序的完成,依赖于对象,通过对象去调用函数,就像派遣员工去做事情,符合人类的思维方式,

同时也优化了编写程序的流程。

下面介绍C++的一些知识:

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

名称空间:namespace

在C++中,可以使用一种叫名称空间的特性。通过名称空间,可以很大程度的提高变量名的重用性,也在跨文件编译时提供便利,

只需要为定义的全局变量定义一个名称空间。

栗子:namespace  n{ int a;  int b;}

要使用该变量,可以using  namespace n ;全部引用或者单个引用using n::a    using n::b;

或者直接在程序里面使用n::a   n::b,这种方式可以有效解决多人共同编程时的变量重名问题,好习惯。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


头文件:iostream

在C++的头文件中,一般风格是不加.h后缀,如果要包含C的头文件,可以选择cmath这种风格。

同时,头文件实际上包含了一些类的声明,例如iostream,包含了输入输出流的类声明。

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------

变量的声明只要在使用前声明就可以了,在初始化时,可以int age = 20,也可以int age(20);,这是一种构造函数。

在类型转换时也可以使用构造函数,栗子:double  a;  int b;   b = int(a);这样看上去更像调用函数。


函数参数默认值

因为有些函数在使用时,参数不一定都要变化,所以可以设定一些默认值,在调用时,根据传入参数的个数

判断是否使用默认值,所以 一旦给一个参数赋了默认值,则它后面的所有参数也都必须有默认值。

1. 一旦给一个参数赋了默认值,则它后面的所有参数也都必须有默认值。
2. 默认值的类型必须正确。
3. 默认值可以在原型或者函数定义中给出,但不能在两个位置同时给出,建议在原型声明中指定默认值。

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------


函数重载:

函数重载的特性在C++中也很重要,这个特性可以使函数在传入不同参数时,自动检索应该执行什么函数,

提高了函数调用的便利,函数重载的要求就是:函数名相同,形参不同。

从而通过不同形参来确定执行。但是函数重载一般用于功能相似,但是传入参数不同的函数。


注意:在同时存在参数默认值和函数重载时,会出现调用冲突。

例如:int add(int a, int b = 10);
    int add(int a);这两个函数在调用add(6)时,编译器就分辨不了调用哪一个函数了。

----------------------------------------------------------------------------------------------------------------------------------------------------------------------


内联函数:

在C语言里,可以利用宏定义来模拟函数,但是有很多不足之处

而在C++中,可以使用inline来使函数成为内联函数,以减少函数调用的次数,减少时间,一般适用于小函数。

而且inline只需在函数定义的时候加就可以了,例如inline double kf(double n),在声明时加不加都可以。

调用的现象和复制粘贴一样,但是效率上高。


------------------------------------------------------------------------------------------------------------------------------------------------------------------------


引用变量:

其实个人理解,引用变量和在C语言中使用int  *const  p 的效果很类似,就是一个指针常量,可以修改指向地址的内容,

但是不能更改指向的地址,比较安全。

在C++中使用引用变量,栗子: int age;  int  &p = age;  相当于给变量取个别名,一般用在函数传递参数时,需要回写到上级函数

例子:

int led(int &a,int &b);在调用时传入参数led(c,d),相当于c和d传到led函数内,并且修改a、b的值,也就是修改了c、d的值


-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------


申请堆区空间:

在C语言中,使用malloc和free函数来申请空间和释放空间。

在C++中,使用new和delete函数来处理,因为C++有类的概念,所以需要用new来申请类的空间,

并且注重于申请空间的类型。

例子:

申请整形空间:int *p = new int ; 这样p就指向一个整形空间

申请字符型数组空间:char *p = new char[20] ;申请一片20个字节的空间

也可以申请类的空间:string *p = new string("hello"),会调用类的构造函数。


释放空间:使用delete函数。

例子:

如果是一个数据   delete p;

如果是一个数组   delete []p;


-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

this指针:

该指针用于访问不同类的对象成员空间,所有的成员函数内部都有一个隐含的this指针,

不同对象调用函数,this指针就保存谁的地址。

类的大小:类的大小通过计算数据成员空间,而函数成员不占空间,只是调用代码,并且函数成员是共享的


-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


构造函数:

1.构造函数是一个特殊的函数,在创建对象时会自动调用

2.如果采用自己编写构造函数,则必须在类里面自定义一个构造函数

3.构造函数的格式:无返回类型,所以定义格式为       类名(形参列表),构造函数支持参数默认值和函数重载。

4.构造函数的作用:给对象分配一个标识符,为对象的数据成员分配空间。

5.对成员初始化,需要程序员自己编写赋值规则。

6.初始化表达式的用法 : 类名(形参列表):变量名(数值),变量名(数值)........

    初始化表达式的实际执行顺序是根据类定义里面成员变量的顺序来定义的,最好书写顺序和

   声明的顺序一致。


ps:构造函数不能显示调用。


--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


复制构造函数:实际上,如果我们没有自定义复制构造函数,编译器会自动生成一个简单的。

1. 格式:    类名(const point &p)

使用复制构造函数这种思想,可以使我们在定义同一类产生的对象之间直接赋值。

例: 类名   对象名1;  类名    对象名2  =  对象名1;或者用括号重载。


2.一般复制构造函数使用默认的就足够了。

在类里面如果用到了堆区空间的申请和释放,就需要自己定义复制构造函数,防止使用已释放的空间。


---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


析构函数:

析构函数也是一个特殊的成员函数,当对象超过其作用域时,会自动调用析构函数,清理申请的空间

1. 函数名与类名相同,且前面加上 ~  与构造函数区分
没有返回值类型
没有形参 -- 空的形参列表,因为没有形参列表,所以没有函数重载。

格式: ~类名()
{

}

2.析构函数一般也是编译器默认,除非类里面申请了堆区空间,或者有成员指向堆区空间,需要手动释放,

才需要自己编写


-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------