一、C++与C区别
面向对象编程在程序执行的效率上没有任何优势,它的主要目的是方便程序员组织和管理代码,快速梳理编程思路。
C++ 是在C语言的基础上增加新特性,从语法上看,C语言是 C++ 的一部分,C语言代码几乎不用修改就能够以 C++ 的方式编译。
1. C++程序的命名规则
C++头文件一般采用.h后缀,也用有.hpp的。
C++程序文件一般采用.cpp后缀,也有用.cc的,建议采用.cpp,C++对程序文件的命名没有强制要求,采用.cpp为后缀是大部分程序员的习惯。
2. C++程序的编译 在某些操作系统中,C和C++是同一个编译器,在CentOS中,C的编译器是gcc,C++的编译器是g++。
3. C++是面向对象语言 C语言是面向过程的编程语言,C++是面向对象的编程语言,很多人认为面向对象会比面向过程的方法更先进。仁者和智者的说法各有不同,要慢慢体会,不能人云亦云。
C++的对象,确实可以大幅的提升了C程序员的开发效率,降低程序员犯错的机会。
4. C++输入和输出
大佬曰:在C语言中,我们使用scanf和printf来对数据进行输入输出操作。在C++语言中,增加了cin和cout输入输出,但是我从来不用它,因为它不实用,对格式化的支持实在是太麻烦。 printf实在太完美,太强大。
5. C++异常 大佬曰:C++增加了异常机制,但是,它从诞生开始就一直有争议。 我没有发现C++的异常有什么实用价值,也从来没有用过它。
6. C++命名空间和模板 大佬曰:了解一下命名空间和模板的概念和用法是可以的,会使用就行,但我不建议自定义命名空间和模板,没必要把程序搞得那么麻烦。
7. C++布尔类型(bool) C语言并没有彻底从语法上支持“真”和“假”,只是用 0 和非 0 来代表。这点在 C++中得到了改善,C++ 新增了 bool 类型(布尔类型),它占用 1 个字节长度。bool 类型只有两个取值,true 和 false:true 表示“真”,false 表示“假”。
8. C++定义变量的位置
ANSI C 规定,所有局部变量都必须定义在函数开头,在定义变量之前不能有其他的执行语句。
C99标准取消这这条限制,但是某些编译器对C99的支持很不积极,仍然要求变量定义在函数开头,或者只支持一部分。
取消限制带来的另外一个好处是,可以在 for 循环的控制语句中定义变量。
int total=0;
for(int ii=1; ii<=100 ;ii++)
{
total = total + ii;
}
9. C++函数的缺省参数
在C语言中,函数在声明的时候指定了参数列表,调用的时候函数参数的个数、顺序和数据类型必须与函数声明参数列表相同,
但是在C++中,声明函数的时候,可以为函数指定缺省参数,调用时缺省参数可以不填写。
例如:
int writetofile(FILE *fp,char *strbuf,bool enbuffer=true);
enbuffer参数表示是否启用缓冲区,writetofile函数被调用的时候,
如果只写fp和strbuf参数,不写enbuffer参数,enbuffer参数将缺省为true,
例如:
writetofile(fp,strbuf);
10. C++动态内存管理
在C语言中,动态管理内存用 malloc() 函数,释放内存用 free() 函数。 在C++中,这两个函数仍然可以使用,但是C++又新增了两个关键字,new 和 delete,new 用来动态分配内存,delete 用来释放内存。 和C语言的动态内存管理一样,C++动态内存管理的应用场景不多。
二、函数重载
C++允许多个函数拥有相同的名字,只要它们的参数列表不同就可以,这就是函数的重载(Function Overloading),借助重载,多个功能相近的一系列函数可以使用同一函数名。
函数的参数列表包括参数的类型、参数的个数和参数的顺序,只要有一个不同就叫做参数列表不同。 注意: 函数的返回值不同能否作为函数重载的依据; 函数的参数名不同能否作为函数重载的依据。
三、类和对象
1. 初识
C语言的结构体不允许有函数,定义结构体变量的方法是:
struct 结构体名 结构体变量名;
在C++中,结构体的成员可以有函数,定义结构体变量可以用:
结构体名 结构体变量名;
struct关键字可以不书写。
class是C++的关键字,用于定义类,就像结构体中的sturct。
类的成员变量和结构体成员变量一样,也有数据类型和名称。
在C++中,用类定义一个类的变量叫做创建(或实例化)一个对象,成员变量称为类的属性(property),成员函数称为类的方法(method)。
类的成员变量和成员函数的作用域和生命周期与对象的作用域和生命周期相同。
2. 对象数组 类可以创建数组对象,就像结构体数组一样。 简单示例:
class CGirl
{
public:
char m_name[50];
int m_age;
int m_height;
char m_sc[30];
char m_yz[30];
int Show();
};
{
CGirl Girl[10];
strcpy(Girl[0].m_name,"杨玉环");
Girl[0].m_age=18;
......
strcpy(Girl[9].m_name,"陈圆圆");
Girl[9].m_age=21;
}
对象数组作为参数示例:
#include <stdio.h>
#include <string.h>
class CGirl
{
public:
char m_name[50];
int m_age;
int m_height;
char m_sc[30];
char m_yz[30];
int Show();
};
void testclass(CGirl* GirlArr)
{
printf("-----对象数组as parameter----\n");
GirlArr[0].m_age=165;
(GirlArr[2]).m_age=166;
(GirlArr[4]).m_age=167;
(GirlArr[6]).m_age=168;
printf("0.age=%d 2.age=%d 3.age=%d 4.age=%d 6.age=%d \n",\
GirlArr[0].m_age,(GirlArr[2]).m_age,(GirlArr[3]).m_age,(GirlArr[4]).m_age,(GirlArr[6]).m_age);
}
int main()
{
CGirl GirlArr[10];
testclass(GirlArr);
}
3. 对象的指针
类是一种自定义的数据类型,对象是内存变量,有内存地址,当然也就有类的指针,就像结构体的指针一样。如下:
CGirl queen;
CGirl *pst=&queen;
通过类指针可以访问对象的成员,书写方法与结构体相同。
(*pointer).memberName
或者:
pointer->memberName
示例:
#include <stdio.h>
#include <string.h>
void testclasspointer()
{
CGirl * cg;
CGirl cg1;
cg=&cg1;
cg->m_age=18;
printf("classpointer:%d\n",cg->m_age);
}
int main()
{
testclasspointer();
}
4. 对象作为函数的参数 与结构体一样,对象可以作为参数传递给函数,最好的方法当然是传递对象的地址。 示例:
void testclassparameter(CGirl cg)
{
cg.m_age=19;
printf("classparameter:%d\n",cg.m_age);
}
void testclassparameter(CGirl * cg)
{
cg->m_age=20;
printf("classparameter:%d\n",cg->m_age);
}
int main()
{
CGirl cg;
testclassparameter(cg);
testclassparameter(&cg);
}
5. 对象的初始化和占用内存的大小 对象不能用memset初始化,对象可以用sizeof运算符获取占用内存的大小,但是,在实际开发中,程序员不太关心对象占用内存的大小。
|