为防止头文件被多次引用,采用
#ifndef xxx
#define xxx
...
#endif
xxx
可以根据头文件名字来定义一个唯一的名字。
int global=1000;//可以在别的文件用extern引用
static int one_file=50;//只能在本文件用
const int f=10;//等于 static const int f=10;其他文件不能用
extern const int g=10;//其他文件可以用
void fun1(){
static int c=0;//静态,只能在本函数内用
}
以上代码表示static有2种意义:
1.用于局部声明,表示变量是静态变量。
2.用于代码块外声明,表示内部链接性,而变量已经是静态了。
未被初始化的静态变量所有位都被设置为0,成为零初始化。
constexpr:创建常亮表达式
变量声明:
- 定义声明,会开辟空间
double up;
extern char gz='z'; //因为有初始化所以也是定义声明
- 引用声明,不会开辟空间
extern int b;
函数的链接性默认为外部的,即其他文件可以用(用extern或者不用),用static设置为内部的。
语言链接性
在c语言中,如spiff
这样的函数名翻译成_spiff
,这称为c语言链接性,而c++也有c++的语言链接性,和C不同。
extern "C" void spiff(int); //用C的语言链接性查找函数
extern void spoff(int); //默认就是C++语言链接性查找函数
extern "C++" void spaff(int);//或显式
命名空间
用户命名空间:
namespace Jack{
double p;
void f();
}
可以把名称加入到已有的名称空间中。
访问:
Jack::f();
或者
using Jack::f;
f()
或者
using namespace Jack;
f();
struct默认是public的,class默认是private的。
Stock s1=Stock("aa",11);//初始化,可能会创建临时对象(也可能不会)
Stock s2("aa",1);//同上
s2=Stock("b",11);//赋值,一定会创建一个临时变量
Stock s3={"cc",11};//列表初始化
Stock s4{"cc",11};
const成员函数:void Stock::show() const
,只要类方法不修改对象,就应该 声明为const
接受一个参数的构造函数允许用赋值语法将对象初始化为一个值:
Classname obj=value;
两种类型转换:
Stock(double d);//会将double隐式转换成Stock
Stock(double d,int a=0);//第二个提供默认值也会隐式转化
explicit Stock(double d);//会关闭隐式转化
上面是将数字转化成类对象
下面是将类对象转化成数字,叫做转换函数
operator double();//转换成double
explicit operator double();//同样,需要显示类型转换才会转换,如(double) xx;
c++会默认提供下面成员函数:
-
默认构造函数
-
默认析构函数
-
复制构造函数
Class_name(const Class_name &);
Class StringBad{}; StringBad d(m); StringBad d=m; StringBad d=StringBad(m); StringBad *p=new StringBad(m);
其中中间2种可能生成中间匿名对象,最后一种一定生成中间匿名对象
-
赋值运算符
-
地址运算符
StringBad a("aa");
Stringbad b;
b=a;//会调用赋值运算符
StringBad c=a;//会调用复制构造函数,不一定调用赋值运算符
对const数据成员,和引用类成员,初始化必须用初始化列表来初始化。
对于简单数据类型成员,使用初始化列表和在函数体内赋值没什么区别,但对于本身就是类对象的成员来时使用初始化列表效率更高。
- 右值引用
如int && r=13;
,int && r = x+y
,传统的左值引用只能出现在=
的左边,现在的右值引用如常量是出现在=
的右边。右值引用的目的之一是实现移动语义。
移动语义
移动语义实际上避免的移动原始数据,而只是修改了记录。
使用std::move()
一般会导致移动操作,但并非一定会
如果您提供了析构函数、复制构造函数或 复制赋值运算符,编译器将不会自动提供移动构造函数和移动赋值运算符;
如果您 提供了移动构造函数或移动赋值运算符,编译器将不会自动提供默认构造函数,复制构造函数和复制赋值运算符。
- 使用关键字default显式地声明这些方法的默认版本
- 关键字delete可用于禁止编译器使用特定方法
- 关键字default只能用于6个特殊成员函数,但delete可用于任何成员函数。
- delete的一种可能用法是禁止特定的转换。
在一个构造函数的定义中使用另一个构造函数,这被称为委托。
网友评论