C++ 第一篇
一 c++ 程序编译
1. 编译方式
1.1 gcc xx.cpp -lstdc++
1.2 g++ xx.cpp // 推荐
2. c++ 文件拓展名
.cpp // 推荐
.cc
.cxx
.C
3. 头文件
#include
----> c++ 中I/O 相关类型,对象,函数都在该头文件中
-----> c++ 中大多数头文件没有.h 后缀
注: C++ 中也可以用标准C库中的内容,同时C++ 提供了一套不带“.h”的替换版本
#include <stdio.h> —> #include
#include <stdlib.h> —> #include
#include <string.h> —> #include
…
只是针对标准C库,对于unix c 中的一些库文件,没有这样的替换
标准c++ 头文件所在的路径
在 /usr/include/c++/5.4.0/cstdio
4. 标准的输入和输出
4.1 使用cout 表示标准输出 // printf
4.2 使用cin 表示标准输入 // scanf
cout 标准输出 表示屏幕 << 表示数据流向
cin 可以理解为标准输入设备 >> 表示数据流向
二 命名空间(名字空间)
1.名字空间的作用
- 避免名字冲突
- 划分逻辑单元
2. 名字空间定义
namespace 空间名 {
名字空间成员1 ;
名字空间成员2 ;
…
}
名字空间成员可以是全局变量,全局函数,类型,名字空间。
名字空间成员使用
-
通过作用域限定操作符 ::
空间名::要访问的成员
eg : std::cout 使用标准名字空间里面的成员cout -
名字空间指令
using namespace 空间名;
注: 在该条指令以后的代码中,指定空间里面的成员都可见,可以直接使用,省略“空间名::"
eg : using namespace std;
以后的代码中可以省略 std:: -
名字空间声明
using 命名空间:: 要访问的成员;
注: 将名字空间中特定的一个成员引入到声明的作用域中,在该作用域中访问这个成员就如同访问自己的成员一样,可以直接访问。省略了”空间名::“ -
全局作用域和无名名字空间
4.1 没有放在任何名字空间的成员,属于全局作用域,可以直接访问。但是如果和局部变量的成员名字相同,将优先访问局部的成员。这是如果还需要访问全局作用域的成员,可以通过”:: xx“显式访问。
4.2 定义名字空间可以没有名字。即无名名字空间(匿名空间)。无名空间里的成员和全局作用域一样,知识被限制在当前文件中使用。
:: func(); -
名字空间合并
定义名字空间时,如果名字一样,将会合并为同一个名字空间。
namespace ns{ 1.cpp
void func1(void){…}
}
namespace ns{ 2.cpp
void func2(void){…}
}
两个会合并为同一个名字空间。
3. c++ 结构体联合体和枚举
3.1 C++ 结构体中可以定义函数 ,成为成员函数(方法),在成员函数中可以直接访问结构体中的其他成员。
C++ 中结构体
struct Http{
…
};
在C 语言中
使用该结构体需要
struct Http http_1;
但是C++ 中可以直接
Http http_1;
#include <iostream>
using namespace std;
struct Teacher{
//
char name[20];
int age;
double salary;
//
void who(void)
{
cout<<"name="<< name<< "age="<< age<< "salary="<<salary<<endl;
}
};
int main()
{
Teacher wang={"wangxiao",45,880.5};
wang.who();
Teacher * pt = &wang;
pt->who();
}
3.2 c++ 联合体
3.2.1 定义联合体可以省略union 关键字
3.2.2 c++ 支持匿名联合
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
union{ // 匿名联合
unsigned int ui;
unsigned char uc[4];
};
ui = 0x12345678;
for(int i=0; i<4; i++)
{
printf("%#x ", uc[i]);
}
printf("\n");
}
注意: %# 表示显示进制 x 表示16进制。
现在计算机内存大多数是小尾端。
3.3 枚举
- 定义枚举变量时,可以省略enum 关键字
- C++ 枚举被看作独立的数据类型,不能当作整型变量使用。
enum STATE {SLEEP,RUN,STOP};
/*enum*/ STATE ai_FUNC()
{
....
return SLEEP/RUN/STOP;
}
STATE a = STOP; // OK
STATE a = 2; // error
四 字符串
4.1 c 语言中的字符串
常量字符串 “hello”
字符指针 char *
字符数组 char []
#include <stdio.h>
int main()
{
char * str1 = "hello";
// *str1 = "h"; // error
char str2[] = "well";
str2[0] = 'p';
printf("%s\n",str2);
strcpy(str1,str2); // error
strcpy(str2,str1); // ok
strcpy(str2,"tiger");// Cross border risk
str1 = str2; // ok
str2 = str1; // error
}
- char * str1 = “hello”; 这一句表示在数据段中定义了一个字符串“hello”, 然后指针 str1 指向这个字符串“hello”;
- *str1 = “h”; // error 这一句话会出错。 因为 str1 指向的是数据段中的内容,数据段中的内容是只读的。因此相当于要修改数据段中的内容,出现错误。strcpy(str1,str2); 与这个的错误原因是相同的。
- char str2[] = “well”; 表示在数据段中有“well”字符串,然后通过copy,将“well” copy到栈中。str2 是栈中的一个数组变量,其中放的是“well”.
- str2[0] = ‘p’; 是正确的。因此栈中的数据是可以修改的。strcpy(str2,str1); // ok 的原因与这个相同
- strcpy(str2,“tiger”);// Cross border risk 这个是有越界的风险。因为str2 的长度为5 但是 tiger 的长度是6。 strcpy 是直到 /0 才会停止,因此可能发生数组越界风险。
- 字符串指针是变量,可以修改指针的指向,所以str1 = str2; // ok 是正确的。
- str2 = str1; // error 这个是错误的。 因为 数组的名字相当于一个常量的指针,指向的内容不能修改。
4.2 C++ 中的字符串
C++ 中的字符串,同时增加了string 类型转换表示字符串
-
定义字符串
string str; // 定义空字符串
string str = “hello”; // 定义同时初始化
// 下面两种写法,运行结果和上面相同
string str(“hello”);
string str = string(“hello”); -
字符串的copy 操作 =
string str1 = “hello”;
string str2 = “welldone”;
str1 = str2; // 拷贝
c++ 的字符串拷贝操作是不会有越界风险。如果长字符串copy 给短的字符串,会将短字符串的内存释放,然后申请一段长的空间,然后将字符串copy 过去。
3) 字符窜的链接操作 + +=
string str1 = “wang”;
string str2 = “fei”;
string str3 = str1 + str2;
cout<< str3<<endl; // wangfei
str1 += str2;
cout << str1 <<endl; // wangfei -
字符串的比较 == != > < >= <=
字符串比较的是字符串的首字母的ASCII 码值
5) 字符串使用的随机访问 []
string str = “hello world”;
str[0] = ‘H’;
str[6] = ‘W’;
注意长度不能越界
6) 成员函数
size()/length() // 获取字符串的长度
string str = “hello”;
str.size() // 5
str.length()// 5
c_str() // 获取C 风格的字符串 const char *
string str = “hello”;
cout<< strlen(str.c_str())<< endl; // error
练习:
- 使用 string 表示字符串,从键盘输出字符串,统计其中 ‘w’/ ‘W’ 的个数。
#include <iostream>
using namespace std;
int main()
{
string str;
cin >> str;
int w_num = 0;
for(int i = 0; i< str.length(); i++)
{
if ('W'== str[i] || 'w' == str[i])
w_num++;
}
cout << "the num of w ="<< w_num<<endl;
}
- 使用string 字符串,从键盘中输入,然后将字符串反转,输出到屏幕上。
例如 : 输入 abcd
输出 dcba
#include <iostream>
using namespace std;
int main()
{
string str;
cin >> str;
int len = str.length();
for(int i = 0; i < (len /2); i++)
{
str[i] = str[i]^str[len-1-i];
str[len-i-1]= str[i]^str[len-1-i];
str[i] = str[i]^str[len-1-i];
}
cout << str <<endl;
}
五 C++ 中的bool
- bool 类型在C++ 中是基本类型,专门表示逻辑值 true /false;
- bool 类型在内存中占一个字节。: 1 true 0 false
bool func () {
return true/false;
} - bool 类型的变量可以接收任意类型的表达式结果, 其值为0 表示假 非0 表示真
bool b = true;
char * p = NULL; // (void*)0
b = p ; // 此时 b 为0, 因为*p 指向 空指针