Pinvon's Blog

所见, 所闻, 所思, 所想

C++学习

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.

Comments

使用 Disqus 评论
comments powered by Disqus