课程准备-从C到C++
内容提要
- 数据的输入输出
- 变量的初始化及常变量(常变量与C相似)
- 引用及函数间参数的引用传递
- 命名空间
- 动态内存分配
数据的输入和输出
由于C++是C with calss,C++对C的完全兼容使得我们在同一个文件中对比这两种语言成为可能
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
// C
int x;
scanf("%d", &x);
printf("%d\n", x);
//C++
int y;
cin >> y;
cout << y << endl;
}
变量初始化
C++提供面向对象的初始化方法
int x = 10;
int y(10);
引用及函数间参数的引用传递
1.引用
C++允许给变量取一个别名(引用),引用是需要加上引用说明符&
并且给出要引用的对象如下的xa
int x(10);
int &xa = x;
cout << xa << endl;
但是注意,计算机不会给xa
再分配空间,xa和x共用同一个内存空间,访问xa
就是访问x
2.函数间引用参数的传递
下面代码中,函数swap
交换了形参a、b
的值,也就实际上交换了实参x、y
的值
void swap(int &a, int &b){
int t;
t = a; a = b; b = t;
}
int main()
{
int x(10);
int y(20);
swap(x, y);
cout << x<<endl<<y;
}
引用传递的特点
引用传递将背调函数的形参定义成主调函数中实参变量函数的引用,被调函数通过该引用间接访问主调函数中的变量
被调函数修改的形参实际上修改的是对应的实参。换句话说,被调函数可以通过该引用修改实参的值,将出具传回主调函数引用传递是一种双向数据传递机制
引用传递时,*实参必须是变量
好处是,1.不需要分配内存;2.通过引用实现双向数据传递
几种特殊形式的函数
1.带默认形参的函数
这个部分跟Python中的缺省值一样,如下面这个例子
double Exchange(double amount, double rate = 6.1104){
return amount/rate;
}
int main()
{
cout << Exchange(500)<<endl;
cout << Exchange(500, 6.1104)<<endl;
cout << Exchange(500, 7)<<endl;
}
输出
81.8277
81.8277
71.4286
带默认形参函数的语法细则
- 带默认值的形参。其他不带默认值的需要给出实参
- 在函数原型中指定默认值,声明中指定了默认值,就不能再声明。同一作用域中只能指定一次默认值
- 同一函数在不同作用于中可以指定不同的默认值(根据局部优先原则)
- 带默认值的形参必须定义在形参列表的后面
C++中,如果两个函数的形参个数不同,可以重名,就称为重载函数:C++编译器自动调用形参实参匹配的函数
用处是方便记忆
内联函数,函数定义的函数头前加inline,用来减少函数间跳转,以提升效率。而且需要保证内联函数的足够简单(如果有循环可能不能保证以内联函数的形式编译),所以一般内联函数是多次调用的简单函数
命名空间
如下定义了一个命名空间
namespace Tom
{
int x,y;
void fun(){...}
}
访问命名空间中的函数和全局变量
1.直接访问
Tom::x = 10;
Tom::fun1()
2.单独声明各标识符的命名空间
using Tom::x;
x = 10l
3.先统一声明命名空间中的所有标识符
引入Tom命名空间中的所有全局变量和函数
using namespace Tom;
x = 10;
fun();
此外C++还有匿名函数空间,如果定义时没有定义命名空间,则输入该空间
引入头文件外还要引入命名空间
动态分配
- 分配内存:new运算符
- 释放内存:delete运算符
静态
int x;
x = 10;
cout<<x;
C++动态内存分配
单个变量
1.指针变量名 = new数据类型(初始值)
2.delete指针变量名
int *p;
p = new int;
*p = 10;
cout<<*p;
delete p;
或者更简单的表达
int *p = new int(10)
一维数组
指针变量名 = new数据类型[整数表达式];
delet[]指针变量名
中括号指是一个数组,释放空间要一起释放;例如
int *p = new int (5);
*(p+1) = 10;
p[1] = 10;
cout<< *(p+1);
delete []p
下面这个例程生成斐波拉契数列
#include <iostream>
using namespace std;
int main()
{
long* p = new long(30);
p[0] = p[1] = 1;
for(int i = 2; i<30; i++){
p[i] = p[i-1]+p[i-2];
}
for(int i=0; i<30; i++)
cout << p[i]<<" ";
delete []p;
}
至此,已经做好了学习C++的准备
面向对象程序设计方法
程序一般包括四项功能
- 定义保存数据的变量
- 输入原始数据
- 处理数据
- 输出处理结果
怎么从结构化程序设计演化到面向对象程序设计
- 程序员乙提供函数,甲调用函数
- 程序员乙提供结构体类型(包含变量)(重用数据代码)
- 程序员乙提供类和对象(数据成员和函数成员):包含类实现和类分类两个部分
(2.h 数据代码)
class Rectangle
{
Public:
int a;
int b;
int Area();
int len();
}
(2.cpp,算法代码)
int Rectangle::Area()
{ return::Area();}
int Rectangle::len()
{ return(2*(a+b));}
结构化程序设计中,函数是重用算法代码的基本语法形式
- 代码提供者
- 代码使用者
程序设计方法:
- 结构化程序设计方法
- 数据跟算法是分离的(数据代码和算法代码,原型声明代码都需要修改)
- 面向对象程序设计方法
- 数据类
- 变量和函数集中在一起,修改时只要修改与数据类的定义代码即可
- 一个类通常由一位或少数几位程序员编写,牵扯程序员少
封装
输入输出也封装在类中(cin和cout)
将不需要被外界直接访问的成员封装起来
- 开放
- 隐藏
访问权限
- 公有权限 pubilc
- 私有权限 private
- 保护权限 protected
公有成员是封装后类对外的接口
一个类必须有公有成员,否则这个类无法使用
访问权限要合理设定
private
public
面向对象程序设计引入了分类(抽象)、封装、继承和多态的思想
大功告成
学习经历:
楼主之前一直想学C++,而且下学期有OOP的课,就准备趁寒假自学下。博主有C语言和比较好的DataStructure的基础,而且又接触过面向对象的Python语言(虽然对其中的面向对象部分使用较少)。所以觉得C++应该可以在比较短的时间内入门。资料主要是参考中国大学MOOC平台上中国农业大学的C++语言程序设计(下)