c和c++的一些区别
gcc hello.cpp -lstdc++ 链接c++库
hello.cpp
#include<iostream>
int main
{
std::cout<<"hello world\n";
return 0;
}
可以使用c语言的头文件前面加c去掉.h stdio.h==》cstdio
名字空间:标准库中的所有名字都放在一个叫std的名字空间中,使用时要加std::前缀。偷懒的办法是用 using namespace std;来表示自动在标准库的名字前加std::。
输入输出:cin>>变量/cout<<数据 数据类型编译器会自动识别
g++ hello.cpp
#include<iostream>
using namespace std;
int main
{
std::cout<<"hello world\n"<<"adsasdas"<<endl;
char name[20];
cin>>name;
return 0;
}
名字空间用法:解决名字冲突问题
定义:
namespace 名字{
变量声明、定义、函数声明、定义。。。
}
多个同名的名字空间会合并在一起。如果需要也可以在名字空间里嵌套名字空间
namespace a{
namespace c{
int x;
}
}
使用:名字空间::内部的名字 a::c::x
统一指定名字空间
using namespace a;
c::x
匿名名字空间(全局名字空间)
可以直接使用名字,也可以加::
var =123;
::var=123
输入输出:在写程序时不用写类型,编译器自动识别,运行时还是要正确输入,如果输入无效不会被取走而且读取失败
结构、联合、枚举
定义完毕之后得到的是自定义类型。
在c++中使用结构、联合、枚举类型来定义变量时,不再重复关键字。
结构定义时,成员不单可以是数据,还可以是函数,甚至还可以是类型。
#include<iostream>
#include<cstring>
using namespace std;
namespace abc
{
struct Student
{
char name[20];
int age;
void print()
{
cout<<age<<' '<<name<<"is good"<<endl;
}
};
}
int main()
{
abc::Student s1={"xiong",18};
using namespace abc;
Student s2={"hu",19};
s1.print();
s2.print();
return 0;
}
支持匿名联合
c
union xxx{
int a;
char b[4];
}
union xxx v;
c++ xxx v;
v.a,v.b
union{
int x;
char y[4];
};
x=0x61626364;
y[0]=‘d’;
c++里枚举不在等同于整数类型,如果需要转换可以用强制转换。
c++自带bool类型
字符字面量:
‘*’
在C语言中没有真正的字符字面量,用的实际都是int。
void*类型:
严格限制不能赋值给其他地址类型c++是一种强制类型语言。
类型转换:
强制类型转换在c的基础上增加了一种形式:类型(数据)
不提倡使用强制类型转换,不容易寻找修改,如果需要类型转换,c++提倡另外4种方式:
static_casr<类型>(数据)用于数值类型之间以及void和别的类型之间
reinterpret_cast<类型>(数据)用于数值类型或者地址类型相互之间。
const_cast<T*>(T常量的地址)去掉const限制
dynamic_cast
int a = static_cast<int>(123.45);
void* p =&a;
int* q = static_cast<int*>(p);
char* r = reinterpret_cast<char*>(q);
const int c=b;
*const_cast<int*>(&c)=200;//去除限制
volatile 不稳定的变量
函数:
在C语言中 默认返回int类型,c++中不适用。
在C语言中,空参数表示参数个数随意,c++中则表示无参。因此,函数在调用前必须声明或者定义。
重载:允许多个函数同名,但要求不同的参数表(不同类型或者个数或者顺序。。。要让编译器能分清该调用哪一个)。自动类型提升c++依然适用。与返回类型无关。
xxx max(int,int);
xxx max(int,int,int);
xxx max(double,double);
xxx max(int [],int);
形参默认值:如果函数的某个形参在调用时绝大多数情况下都传递的是某个特定实参,那么可以把这个实参值指定为这个形参的默认值,调用时可以不再传递,有默认值的形参要靠右。
void show(char name=‘N’);给输入设定默认值。
声明和定义分开时,形参默认值放在声明中
在c++中宏函数基本不用,一是不符合强类型要求,二是副作用。取而代之的是内联函数,用inline表示。内联函数会在调用的地方展开函数代码而不是产生调用,跟宏函数一样高效,但却有明确的参数类型而且没有副作用。是否真正执行inline的要求,完全由编译器自己决定。
动态内存管理:C语言malloc/free/calloc/realloc,返回void*
c++new 类型
new 类型[元素个数]
delete 地址
delete[] 地址
new(指定地址)类型:在指定的地方分配内存(很少使用)
int* pi = new int(初始值);不加初始值为0
char* pc = new char[n];
delete pi;
delete[] pc;释放内存空间
#include new失败会throw抛出异常导致程序终止,可以用nothrow来申请内存失败时像c的内存管理函数一样返回NULL。
关键字,用来表示运算符:
and&&,or||,not!,and_eq&=,or_eq|=,not_eq!=,bitand&,bitor|,xor,compl~,xor_eq=
引用:本质上是指针,编译器自动取地址、加*号
定义:类型& 名字=初始值;引用必须初始化,用谁初始化,它就跟谁是同一体。
特别说明:形参是在调用时由实参初始化。返回值是在返回时由return后面的数据初始化。
引用使用变量本身而不是复制数据,改变引用变量的值也就改变了同一体的值,引用不是新的数据类型,而是表示传递方式。
#include<iostream>
void swap(int &a,int &b)
{
int t=a;
a=b;
b=t;
}
int main()
{
int a=10;
int b=20;
swap(a,b);
}
字符串:
c++风格字符串string类型,头文件string,同样支持像字符数组那样按下标访问元素,支持+,=,各种比较运算,不用考虑空间问题,成员函数size()length()都可以取得字符串长度。成员函数c_srt()可以返回对应的c风格字符串(只读)。
数组:
c++风格数组用vector<类型>数组名(长度,元素初始值),用法跟数组一样,随时可以成员函数resize(长度)来调整大小,随时可以用成员函数size()来取得元素个数。头文件