(一)编写前需要知道的小知识点
C语言一些可编译通过而c++不可以:
#include <stdio.h>
//返回值默认为int型
//参数列表默认,瞎传也没事
func(){
printf("test\n");
}
int a;
int a;
int b = 1; //定义,编译通过
int b; //声明,类似函数的声明,写多少次都无所谓,编译通过
//以下两条编译不通过,两次定义,重定义
//int c = 1;
//int c = 1;
int main(void){
func();
func(123,"123", 1.23);
return 0;
}
- C++编译
gcc xx.cpp -lstdc++
或g++ xx.cpp
- C++源文件扩展名
1).cpp //推荐
2).cc
3).cxx
4).C - 头文件
#include
1)C++中所有和I/O相关的类型、对象、函数都在该头文件中
2)C++中多数头文件没有".h"后缀
3)C++开发中也可以使用标准C库的头文件,同时提供一套不带".h"替换版本
#include <stdio.h> <==> #include
#include <stdlib.h> <==> #include
#include <string.h> <==> #include
… - 标准输入输出
1)使用cin对象表示表示标准输入//类似scanf
2)使用cout对象表示标准输出//类似printf()int a = 0; scanf("%d",&a);//C语言 cin >> a;//C++语言 注:“>>”成为输入操作符 int i = 0,double d = 0.0; scanf("%d%lf",&a,&d);//C cin >> a >> d;//C++
int a = 123; printf("%d\n",a);//C语言 cout << a << endl;//C++语言 注:“<<”被称为输出操作符 int i = 100,double d = 2.34; printf("%d,%lf\n",i,d);//C语言 cout << i << ',' << d << endl;//C++语言
(二) 名字空间(命名空间)
-
名字空间作用
1)避免名字冲突
2)划分逻辑单元 -
定义名字空间
namespace 名字空间名{ 名字空间成员1; 名字空间成员2; ... }
注:名字空间的成员可以是全局变量、全局函数、类型、名字空间.
-
名字空间成员的使用
1)通过作用域限定符号“::”访问
名字空间名::要访问的成员;
eg:“std::cout”,访问std标准名字空间里面的输出流对象cout
2)名字空间指令
using namespace 名字空间名;
注:在该条指令以后的代码中,指定名字空间的成员都可见,可以直接访问,省略"名字空间名::"
3)名字空间声明
using 名字空间名::要访问的成员;
注:将名字中的特定成员引入到当前声明的作用域中,在该作用域访问这个成员,就如同访问自己的成员一样(如果和名字空间指令产生了冲突,不会认为是歧义,优先名字空间声明),可以直接访问,省略"名字空间名::" -
全局作用域和无名名字空间
1)没有放在任何名字中的成员,属于全局作用域,可以直接访问,但如果和局部作用域的成员一样,将优选访问局部作用域的,这时如果还希望访问全局作用域的成员,可以通过"::xx"显式指明
2)定义名字空间时可以没有名字,即为无名名字空间(匿名空间),无名空间的成员全局作用域成员类似,只是被限制在当前文件中使用。 -
名字空间嵌套
namespace ns1{ int num = 100; namespace ns2{ int num = 200; namespace ns3{ int num = 300; } } } cout << ns1::num << endl;//100 cout << ns1::ns2::num << endl;//200 cout << ns1::ns2::ns3::num << endl;//300
-
名字空间合并
//1.cpp
namespace ns{
void func1(void){…}
}
//2.cpp
namespace ns{//自动和1.cpp的合并到一起
void func2(void){…}
}
namespace.cpp
#include <iostream> using namespace std;//标准名字空间指令 namespace ns1{ void func(void){ cout << "ns1的func" << endl; } int num = 100; } namespace ns2{ void func(void){ cout << "ns2的func" << endl; } int num = 200; } //int num = 300;//全局作用域 namespace{//无名名字空间 int num = 300; } int main(void){ /* using ns1::func;//名字空间声明 func();//ns1的func //using ns2::func; //func();//歧义错误 using namespace ns2;//名字空间指令 func();//ns1的func,局部优先 ns2::func();//ns2的func */ cout << num << endl;//300 using ns1::num;//名字空间声明 cout << num << endl;//100,局部优先 cout << ns2::num << endl;//200 cout << ::num << endl;//300 return 0; }
(三) C++的结构体、联合体和枚举
- C++结构体
1)当定义结构体变量时可以省略struct关键字
2)结构体里可以定义函数,成为成员函数(方法),在成员函数里面可以直接访问结构体中的其它成员。
- struct 成员默认是public
- C++联合体
1)当定义联合体变量时可以省略union关键字
2)支持匿名联合 - 枚举
1)定义枚举变量时可以省略enum关键字
2)C++中枚举被看作是独立数据类型,不能把枚举变量当做int变量使用
struct.cpp
#include <iostream> using namespace std;//标准名字空间指令 struct Teacher{ //成员变量 char name[20]; int age; double sal; //成员函数 void print(void){ cout << "姓名:" << name << ",年龄:" << age << ",工资是:" << sal << endl; } }; int main(void){ /*struct*/Teacher wangjl={"王建立",45,800.5}; wangjl.print(); Teacher* pt = &wangjl; pt->print(); return 0; }
union.cpp
#include <iostream> using namespace std; int main(void){ union{//匿名联合 unsigned int ui; unsigned char uc[4]; }; ui = 0x12345678; for(int i=0;i<4;i++){ //hex:以十六进制方式打印 //showbase:显示进制标识 cout << hex << showbase << (int)uc[i] << ' '; } cout << endl; return 0; }
(四) 字符串
-
回顾C语言中字符串
1)字面常量字符串: “hello”
2)字符指针: char*
3)字符数组:char[] -
C++中兼容C语言的字符串,另外还增加了一个string类型,专门表示字符串:
1)定义字符串
string s;//定义空字符串
string s = “hello”;//定义同时初始化
//和上面写法结果等价
string s(“hello”);
string s = string(“hello”);
2)字符串拷贝:=
string s1 = “hello”;
string s2 = “world”;
s1 = s2;//拷贝构造,等价s1=string(s2);
cout << s1 << endl;//“world”
3)字符串连接:+ +=
string s1 = “hello”;
string s2 = “world”;
string s3 = s1 + s2;//连接
cout << s3 << endl;//“helloworld”
4)字符串比较:== != > < >= <=
if(s1 == s2){…}
if(s1 != s2){…}
5)随机访问:[]
string s = “helloworld”;
s[0] = ‘H’;
s[5] = ‘W’;
cout << s <<endl;//“HelloWorld”
6)常用的成员函数
size()/length();//获取字符串长度
c_str();//返回C风格的字符串(const char*)
string s = “hello”;
cout << s.size() << endl;//5
cout << s.length() << endl;//5
string cpp_s = “abc”;
const char* c_s = “def”;
cpp_s = c_s;//ok
c_s = cpp_s;//error
c_s = cpp_s.c_str();//ok