从C到C++
引用
虽然在功能上比指针弱,但减少了出错的可能。 eg. 使用引用交换两个变量:
#include<iostream>
using namespace std;
void swap2(int& a, int& b) {
int t = a; a = b; b = t;
}
int main() {
int a = 3, b = 4;
swap2(a, b);
cout << a << " " << b << "\n";
return 0;
}
- 在参数名之前加一个“&”符号,就表示这个参数按照传引用的方式传递。
- 此时,在函数内改变的参数值,也会修改到函数的实参。
- C++中的引用就是变量的“别名”,它可以在一定程度上代替C中的指针。
- 使用“传引用”的方式让函数直接修改实参。
字符串 String
- 对于String对象使用
getline() 函数可以一行一行读取数据(相当于C语言中的fegts ,但无须指定字符串的最大长度) - 然后用这 一行创建一个“字符串流”——ss。接下来只需像读取cin那样读取ss即可
- 可以把string作为流进行读写,定义在sstream头文件中
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
int main() {
string line;
while(getline(cin, line)) {
int sum = 0, x;
stringstream ss(line);
while(ss >> x) sum += x;
cout << sum << "\n";
}return 0;
}
结构体
- struct定义“纯数据”的类型,只包含较少的辅助成员函数
- class定义“拥有复杂行为”的类型
#include<iostream>
using namespace std;
struct Point {
int x, y;
Point(int x = 0, int y = 0) : x(x), y(y) {}
};
Point operator + (const Point& A, const Point& B) {
return Point(A.x + B.x, A.y + B.y);
}
ostream& operator << (ostream &out, const Point& p) {
out << "(" << p.x << "," << p.y << ")" ;
return out;
}
int main() {
Point a, b(1,2);
a.x = 3;
cout << a+b << "\n";
return 0;
- 结构体Point中定义了一个函数,函数名也叫Point,但是没有返回值
- 这样的函数称为构造函数(ctor)
- 注意这个构造函数 的两个参数后面都有“=0”字样,其中0为默认值。也就是说,如果没有指明这两个参数的 值,就按0处理,因此Point( )相当于Point(0,0)。
- “:x(x),y(y)”则是一个简单的写 法,表示“把成员变量x初始化为参数x,成员变量y初始化为参数y”。也可以写成:
Point(intx=0,inty=0){this->x=x;this->y=y;} 这里的“this”是指向当前对象的指针。this->x的意思是“当前对象的成员变量x”,即 (*this).x。 - 接下来为这个结构体定义了“加法”,并且在实现中用到构造函数。这样,就可以用a+b 的形式计算两个结构体a和b的“和”了
- 最后,定义这个结构体的流输出方式,然后就可以用cout << p来输出一个Point结构体p 了。
模版
当数据类型变换后仍然可以使用,如设置为int就不能解决double类型。 可以通过template 模版的方式对函数进行修改。
template<typename T>
T sum(T* begin, T* end) {
T *p = begin;
T ans = 0;
for (T *p = begin; p != end; p++)
ans = ans + *p;
return ans;
}
累加操作为ans=ans+*p ,而不是ans+=*p 。因为Point结构体中只定义了+ 运算符,没有定义+= 结构体和类(class)也可以是带模板的
template <typename T>
Point<T> operator + (const Point<T>& A, const Point<T>& B) {
return Point<T>(A.x+B.x, Axy+B.y);
}
template <typename T>
ostream& operator << (ostream &out, const Point<T>& p) {
out << "(" << p.x << "," << p.y << ")";
return out;
}
这样就可以同时使用int型和double 型的Point.
|