C++学习
Table of Contents
C++基础 C++风格字符串 名称空间 引用
编译
# 编译 g++ -c xxx.cpp # 生成xxx.o文件 # 链接 g++ xxx.o # 生成a.out文件 g++ xxx.o -o newname # 给a.out取一个新名字 # 编译链接 g++ xxx.cpp -o newname
头文件
C++头文件不加 .h
.
namespace(避免名字冲突)
在C中没有这个概念, 大型项目中, 有时会有函数名冲突的情况, 在C++中引入namespace来解决这个问题. 内部使用可不加名字空间, 外部调用需要加名字空间.
C中需要先定义所有变量, 再来使用(但后来的标准也修改了这一项). 而C++则是在使用的时候再定义.
如果认为 std
名字空间中有很多用不上的名字, 可以直接在开头将 using namespace std
改成 using std::cout
, using std::cin
, using std::endl
, 还可以直接不用 using ...
, 而是在程序中, 需要用 cout
时, 改成 std::cout
. 有什么好处?
namespace例子:
#include <iostream> #include <string> using namespace std; namespace nameA{ string name = "Pinvon"; int age = 10; } namespace nameB{ char name[20] = "pwlin"; } using namespace nameB; char name[20] = "global"; int main() { // cout << "my name is " << name << endl; // 编译出错, 因为未指明是哪个namespace的name // cout << "age is " << age << endl; // 编译出错, 即使名字没冲突, 也要指明是哪个域的, 应改成 nameA::age cout << "my name is " << nameA::name << endl; // 正确; Pinvon cout << "his name is " << name << endl; // 正确; pwlin string name = "test"; cout << name << endl; // 正确, 局部优先, 会输出test // 注释pwlin那行后添加以下语句 cout << ::name << endl; // 正确, ::表示全局范围, 会输出global return 0; }
string s1与char s21的对比.
- s2称为C风格字符串, 以'\0'结束; s2称为C++风格字符串;
- s1保存的字符串没有限制(实际上为1G); s2保存的字符串有长度限制;
- 初始化后, 不能再给s2赋值, 即s2=xxx是不对的, 要用strcpy();
- 连接字符串, s2要用strcat(); s1直接使用 s1+=xx;
- 比较字符串, s2要用strcmp(); s1直接使用操作符==, >=, <=;
- 取字符串长度, s2要用strlen(); s1使用s1.size()或s1.length();
- 查找子串, s2要用strchr()或strstr(); s1使用s1.find(), 就可找字符串和字符;
- 访问某元素, 都使用s1[i]或s2[i];
- C风格字符串可自动转成C++字符串, 如s1="xxx"; 或if(s1>=s2);
- C++风格字符串转成C风格字符串: s1.c_str();
严格类型检查
如enum类型, 其成员在C中当成是整型, 而C++则不是.
#include <iostream> enum Course{UNIX, C, CPP, UC, VC}; int main() { Course c; int n; c = CPP; n = CPP; //OK c = n; //Error. 不能将int转成Course return 0; }
即: 在C++中, CPP被看成是Course类型, 而不是int类型. 但由于enum类型终究是个整数, 因此可以转成int(向上转换), 而int转成enum是不行的(向下转换, 范围变窄).
如果有两个enum类型, 它们之间各取一个索引为0的数据, 也不能互相转换, 因为C++认为它们的类型不同.
只要记住一点, C++中类型严格, 是什么类型就是什么类型(可变参数例外).
在C++中, 自定义的类型, 在使用时不需要再声明该类型的关键字, 而C则需要. 如:
enum Course{UNIX, C, CPP, UC, VC}; int main(){ enum Course c1; // C语言 Course c2; // C++语言 }
bool
C里没有bool类型.
引用(给变量起别名)
- 在C里, 参数的传递都是使用复制的方式.
- 引用必须初始化. 用谁初始化, 它就是谁的别名. double a = 123.45; double& b = a; (a和b的地址相同).
- 不加const的引用只能用变量来初始化.
double& a = 123.45; // Error const double& b = 1.1; // OK const double& c = d+5; // 引用一个临时值
查看进程的内存使用情况
ps # 找到想看的进程id cd /proc/进程id # 可以 ls cat xxx # 查看某文件的内存映射
Footnotes:
1
DEFINITION NOT FOUND.
Generated by Emacs 25.x(Org mode 8.x)
Copyright © 2014 - Pinvon - Powered by EGO