c++笔记

作者: Jesse_996 | 来源:发表于2020-04-30 16:07 被阅读0次

为防止头文件被多次引用,采用

#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:创建常亮表达式

变量声明:

  1. 定义声明,会开辟空间

double up;
extern char gz='z'; //因为有初始化所以也是定义声明

  1. 引用声明,不会开辟空间

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的一种可能用法是禁止特定的转换。

在一个构造函数的定义中使用另一个构造函数,这被称为委托。

相关文章

网友评论

      本文标题:c++笔记

      本文链接:https://www.haomeiwen.com/subject/grkdihtx.html