面向对象是什么?很难吗?面向对象有什么好处?
让我们先了解一下C++入门基础
C++是C语言的继承,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。
C++擅长面向对象程序设计的同时,还可以进行基于过程的程序设计,因而C++就适应的问题规模而论,大小由之。
C++不仅拥有计算机高效运行的实用性特征,同时还致力于提高大规模程序的编程质量与程序设计语言的问题描述能力
cin:istream对象,标准输入
cout:ostream对象,标准输出
cerr:标准错误。用来输出警告和错误信息给程序的使用者
clog:用于产生程序执行的一般信息
cout<<表达式<<表达式<<……
其中:表达式可以是变量、常量、以及由各种运算符连接起来的运算表达式。
cin>>表达式>>表达式>.……
其中:表达式只能是变量或内存区
代码如下:
//输入2个整数求和
#include
int main()
{
std::cout<<“Enter_two_numbers”<<std::endl;
intv1,v2;
std::cin>>v1>>v2;
std::cout<<“the_sum_of”<<v1<<“and”<<
<<“is”<<v1+v2<<std::endl;
return0;
}
解释:std是一个命名空间,cout和cin是里面的变量名,命名空间是C++为了防止命名冲突,把自己库里面的东西都定义在一个std的命名空间中要使用标准库里面的东西。::是类作用域解析符,使用它可以访问类里面的元素。
字符类型:char、unsignedchar
短整型:short、unsignedshort
整型:int、unsignedint
长整型:long、unsignedlong
单精度浮点型:float、unsignedfloat
双精度浮点型:double、unsigneddouble
逻辑类型:bool
类型转换与C语言相同
枚举类型:enumcolor{red,green,blue,yellow};
数组类型:intdata[128];
指针类型:intp;
结构体类型:structstudent
{
char name[16];
bool sexy;
};
联合类型:union value{inti;intp};
引用类型:intvalue;int&p=value;
类类型
class Clock
{
private:
int hour,minute,second;
public:
…
}
int *p;
p = new int;
*p = 6;
int *p;
int i = 5;
p = new int[i * 20];
p[0] = 10;
p[100] = 30;//编译没问题。运行时导致数组越界
int * p = new int;
* p = 5;
delete p;
delete p; //导致异常,一片空间不能被delete多次
int * p = new int[20];
p[0] = 1;
delete [ ] p;
做一个例题
下面小段程序,哪个是正确的:
A)char * p = new int;
p = ‘a’;
delete p;
B) int *p = new int[25];
p[10] = 100;
delete p;
C) char * p = new char[10];
p[0] = ‘K’;
delete [] p;
答案选C
因为A开辟int型空间却赋值给char类型指针,错误用法
B选项释放数组忘记在数组名前加"[]"
注意:用delete释放的内存空间必须是由new分配的空间,否则执
行delete时将会导致严重的错误。
定义:两个及以上的函数,具有相同的函数名,但是形参的个数或者类型不同,编译器会根据实参的类型及个数的最佳匹配来自动确定调用哪一个函数。
注意:不能以形参名字或函数返回类型的不同来区分函数。
(1) int Max(double f1,double f2) { }
(2) int Max(int n1,int n2) { }
(3) int Max(int n1,int n2,int n3) { }
Max(3.4,2.5); //调用 (1)
Max(2,4); //调用 (2)
Max(1,2,3); //调用 (3)
Max(3,2.4); //error,二义性
C++中,定义函数的时候可以让最右边的连续若干个参
数有缺省值,那么调用函数的时候,若相应位置不写参
数,参数就是缺省值。
void func( int x1, int x2 = 2, int x3 = 3)
{ }
func(10 ) ; //等效于 func(10,2,3)
func(10,8) ; //等效于 func(10,8,3)
func(10, , 8) ; //不行,只能最右边的连续若干个参数缺省
- 默认形参值必须按照从右向左的顺序声明。在有默认值的形参右边,不能出现无默认值的形参。
- 在相同的作用域内,默认形参值的说明应保持唯一;但在不同的作用域内,允许说明不同的默认形参值。
来看一个宏定义
#define abs(a) ((a) < 0 ? –(a):(a))
int main()
{
int m = -2, ret=abs(++m); abs(++m);
ret=((++m) < 0 ? –(++m) : (++m))
return 0;
}
C++中的内联函数既具有宏定义的优点,又克服了宏定义的缺点。
- 函数调用是有时间开销的。如果函数本身只有几条语句,执行非常快,而且函数被反复执行很多次,相比之下调用函数所产生的这个开销就会显得比较大。
- 为了减少函数调用的开销,引入了内联函数机制。编译器处理对内联函数的调用语句时,是将整个函数的代码插入到调用语句处,而不会产生调用函数的语句。
- 定义内联函数使用关键字inline。
inline int Max(int a,int b)
{
if( a > b) return a;
return b;
}
注意事项:
- 并非所有函数都需要定义为内联函数,一般只会将那 些频繁被调用的,并且函数体较小的(只有几条语句) 函数定义为内联函数。
- 内联函数内不允许有循环语句和switch语句,否则按 照普通函数来处理。
做一个例题
下面说法正确的是:
A) 多个重载函数的参数个数必须不同。
B) 两个函数,参数表相同,返回值类型不同,它们是重载关系。
C) 调用一个第二个和第三个参数都有有缺省值的函数时,可以不写第二个实参而写第三个实参。
D) 使用内联函数的目的是提高程序的运行速度。
答案:D
同一个人,多个名字,C++叫做引用。
下面的写法定义了一个引用,并将其初始化为引用某个变量。
类型名 & 引用名 = 某变量名;
int n = 4;
int & r = n; // r引用了 n, r的类型是 int &
引用主要有以下三种用法:
独立引用
作为函数参数
作为函数返回类型
引用应用的简单示例
C语言中,如何编写交换两个整型变量值的函数?
void swap( int * a, int * b)
{
int tmp;
tmp = * a; * a = * b; * b = tmp;
}
int n1, n2;
swap(& n1,& n2) ; // n1,n2
有了C++的引用
void swap( int & a, int & b)
{
int tmp;
tmp = a; a = b; b = tmp;
}
int n1, n2;
swap(n1,n2) ; // n1,n2的值被交换
int n = 4;
int & SetValue() { return n; }
int main()
{
SetValue() = 40;
cout << n;
return 0;
}
输出: 40
需要注意的是,因为返回的引用是一个存储单元,所以函数返回后这个单元的生命期应该不会结束,否则返回值将没有意义。
常量是指在程序运行过程中,其值不能被改变的量。
如:i=255; area=rr3.14;
在程序中直接使用数值有两个问题:
- 可读性差 ;
- 可维护性差 ;
C++为符号常量提供了const方法,格式为:
const 数据类型 符号常量名 = 数值;
注意:在声明时一定要赋初值,而且在程序中间不能改变其值。
用“define”和用“const” 定义符号常量的本质区别:
- 用“#define”定义的符号常量只在编译时完成宏替换(简单的字 符串替换),在程序运行期间不占内存空间。
- 用“const”定义的符号常量在程序运行期间占据内存空间,只是 用const来指明该内存空间的只读约束。
定义常量
const int MAX_VAL = 23 ;
const string SCHOOL_NAME = “Peking University” ;
定义常量指针
int n,m;
const int * p = & n;
p = 5; // 编译出错
n = 4; //ok
p = &m; //ok, 常量指针的指向可以变化
const int * p1; int * p2;
p1 = p2; //ok
p2 = p1; //error
p2 = (int * ) p1; //ok, 强制类型转换
void MyPrintf( const char * p )
{
strcpy( p,"this"); // 编译出错
printf("%s",p); //ok
}
定义常引用
定义引用时,前面加const关键字,即为“常引用”
int n;
const int & r = n;
r 的类型是 const int &
不能通过常引用修改其引用的变量
int n;
const int & r = n;
r = 5; //error
n = 4; //ok
常引用和非常引用的转换
const T & 和T & 是不同的类型!!!
T & 类型的引用或T类型的变量可以用来初始化
const T & 类型的引用。
const T 类型的常变量和const T & 类型的引用则
不能用来初始化T &类型的引用,除非进行强制类型转换。
以上就是今天要讲的内容,本文仅仅介绍了C++入门的简单知识,虽然C++是公认的难学,但以上的入门知识还是简单的,我们务必掌握,为以后打好基础,重在坚持。欢迎阅读,感觉大家的指正。