2.1 C++的起源和特点
2.1.1 C++语言的特点
(1)C++是C的超集,保持了与C的兼容性;
(2)C++是一个更好的C,它保持了C的简介、高效和接近汇编等特点,C++更安全;
(3)C++编写的程序质量高,支持代码重用;
(4)增加了面向对象的机制;
2.1.2 C++面向对象的机制
(1)抽象的数据类型;
(2)封装与信息隐藏;
(3)继承的方式实现程序重用;
(4)以函数传承、运算符重载和虚拟函数来实现多态;
(5)以模板来实现类型参数化;
2.2 C++源程序构成
2.2.1简单的C++程序
#include<iostream> //编译预处理命令
using namespace std; //使用命令空间
int main(){
int x, y, sum;
cout<<"Please input two integers:"<<'\n';
cin>>x; cin>>y; sum = x + y;
cout<<"x + y = "<<sum<<endl;
return 0
} //程序体
2.2.2 cin与scanf有什么不同?
(1)cin是个C++类型对象,它的类型是basic_istream;scanf是个不定参数的函数;
(2)cin所属的类重载了>>运算符;
(3)cin也更安全,不会发生内存溢出;
2.2.3 C++程序的结构
结构特性
(1)类的声明部分
(2)类的使用部分
结构特点
#include<iostream> //编译预处理命令
using namespace std; //使用命令空间std
class A{
int x, y, z; ...
fun(){...} ...}; //类声明
int main(){
A a;...
a.fun();
return 0;
} //程序体
2.3 C++在非面向对象方面的扩充
2.3.1 注释行
(1)在C语言中,使用 ”/*“ 及 ”*/“ 作为注释的分界符号;
(2)在C++中,使用 ”/*“ 及 ”*/“ 及 **”//“**作为注释的分界符号;
2.3.2 输入输出
(1)C语言:使用scanf和printf
(2)C++:使用cin和cout
例如,cin和cout的使用
#include<iostream>
using namespace std;
int main(){
char name(20);
cin>>name; //cin输入
cout<<"My name is "<<name; //cout输出
return 0;
}
2.3.3 灵活的局部变量说明
C++允许变量声明与可执行语句在程序中交替出现。这样程序员就可以在使用一个变量时才声明它。
例如在C中,下面的函数f时不正确的:
f(){
int i;
i = 10;
int j;
j = 25
}
C编译时将指示有错,并终止对函数f 的编译,但在C++中,以上程序段时正确的,编译不会出现错误。
2.3.4 结构、联合和枚举名可直接作为类型名
在C++中,结构名、联合名、枚举名可直接作为类型名。在定义变量时,不必冠以struct、union或enum。
例如:
enum bool {FALSE, TRUE};
struct String{
char *ptr;
int length;
};
Bool done; //不必加关键字enum
String str //不必加关键字struct
2.3.5 const修饰符
c语言: #define Limit 100
C++:const Limit = 100
const与#define的作用相似,但是用const更安全
例如
#include<iostream>
main()
{ int a=1;
#define T1 a+a
#define T2 T1-T1
cout<<“T2 is”<<T2<<“\n”;
return 0;
}
此代码中,T1 为a+a,整体代入T2=a+a-a+a=2a。
#include<iostream>
main()
{ int a=1;
const T1=a+a;
const T2=T1-T1
cout<<“T2 is”<<T2<<“\n”;
return 0;
}
而在此代码中,T2 = (a+a)-(a+a)= 0。
const也可以与指针一起使用
const char *name = "chen";//指向常量的指针 *name所代表的内容不可改变
char *const name = "chen";//常指针 name的内容不可改变
const char *const name = "chen";//指向常量的常指针 *name、name 均不可改变
2.3.6 函数原型
一般形式:返回类型 函数名(参数表);
C++定义的函数,没有函数体部分就成为函数原型,也叫做函数的声明。
注: 当函数体在主函数后时,函数要有函数声明。
2.3.7 带有默认参数的函数
(1)在函数声明或定义时,直接对函数赋值,该参数就是默认参数。
(2)在函数调用时,省略部分或全部参数,这时就会使用默认参数进行替代。
例如:
#include <iostream>
using namespace std;
int main()
{ double add(double a=3.2,double b=9.6); //函数声明
cout<<add()<<endl; //函数使用默认参数
}
double add(double a=3.2,double b=9.6)
{ return a+b;}
2.3.8 函数的重载
在C++中允许函数重名,只要函数中含有的参数个数或者参数的类型不一致就可以,这就叫做函数的重载。
参数的个数不同:
#include<iostream>
using namespace std;
int mul(int x,int y) {return x*y;}
int mul(int x,int y,int z) {return x*y*z;}
int main()
{ int a=3;int b=4;int c=5;
cout<<a<<‘*’<<b<<‘=‘<<mul(a,b)<<endl;
cout<<a<<‘*’<<b<<‘*’<<c<<‘=‘<<mul(a,b,c)<<endl;
return 0;
}
参数的类型不同:
#include<iostream.h>
using namespace std;
int square(int i) {return i*i;}
float square(float i) {return i*i;}
double square(double i) {return i*i;}
int main()
{ int i=12;float f=3.4;double d=5.67;
cout<<i<<‘*’<<i<<‘=‘<<square(i)<<endl;
cout<<f<<‘*’<<f<<‘=‘<<square(f)<<endl;
cout<<d<<‘*’<<d<<‘=‘<<square(d)<<endl;
return 0; }
2.3.9 作用域运算符“::"
如果全局变量与局部变量重名,在局部变量作用域内如何访问全局变量呢?
#include<iostream.h>
int avar=10;
main()
{ int avar; avar=25;
cout<<“avar is”<<avar<<endl;
return 0; }
👆👆👆 此代码优先访问局部变量
#include<iostream.h>
int avar=10;
main()
{ int avar; avar=25;
cout<<“avar is”<<::avar<<endl;
return 0; }
👆👆👆 此代码访问全局变量
2.3.10 强制类型转换
C语言:int i = 10; float x = (float)i;
C++:int i = 10; float x = float(i);
2.3.11 命名空间和作用域运算符
namespace Module1
{
void foo() {cout << “Module foo() invoked”<< endl;}
int bar(int x) {return x;}
}
表示函数foo和bar均输入命名空间Module1所管辖。
为了在命名空间内部访问命名空间的内部成员,必须使用命名空间限定表达式。
例如 Module1::foo();
其中”::"是作用域运算符。
① 该表达式表示要访问的是命名空间所指定的作用域中的标识符所指示的函数、变量等。
② 表达式的左操作数允许为空,即 :: 标识符,表示访问全局标识符所指示的函数、变量等 。
参考书籍:《C++面向对象程序设计教程(第3版)》 陈维兴 林小茶 编著