C++杂七杂八学一点吧

指针的 & *

*:间接寻址运算符 返回操作数所指定地质的变量的值

当* 用于声明变量或者函数的时候,意思是该函数/变量是一个指针;

其他情况相当于对变量取值。

&:取地址运算符

对于常见的const&这种函数括号里的东西,const是为了防止修饰的变量被修改。所以一般来说不能改/不需要改的用const&,即在函数内不发生改变的量。而比如*指针的话,需要开辟空间存储指针,但是可以发生变化。指针传参可以成功修改实参的值,因为是通过地址操作实参。而且指针传参可以显式回到一个值,但是还有另外需要返回的量。const是一种引用传参,引用传参要求引用被创建的同时必须被初始化(指针可以在任何时候初始化),不能有NULL引用,一旦引用被初始化,就不能改变引用的关系。

实参与形参

形式参数:定义函数名和函数体的时候使用的参数,用来接收调用该函数时传递的参数。实现主调函数与被调函数之间的联系,没有行参的函数在行参表的位置应该写int。 main(void)函数也可以有行参和返回值,其行参也称为命令行参数。

只在函数内部有效,在被调用的时候才分配内存单元。

实际参数:在调用函数时传递给函数的参数,即传递给被调用函数的值,在进行函数调用的时候,必须有确定的值。

二者在数量上,类型上,顺序上都要严格一致。

多线程

(1). 默认构造函数,创建一个空的 thread 执行对象。
(2). 初始化构造函数,创建一个 thread对象,该 thread对象可被 joinable,新产生的线程会调用 fn 函数,该函数的参数由 args 给出。
(3). 拷贝构造函数(被禁用),意味着 thread 不可被拷贝构造。
(4). move 构造函数,move 构造函数,调用成功之后 x 不代表任何 thread 执行对象。

inline

inline是C++关键字,在函数声明或定义中,函数返回类型前加上关键字inline,即可以把函数指定为内联函数。这样可以解决一些频繁调用的函数大量消耗栈空间(栈内存)的问题。关键字inline必须与函数定义放在一起才能使函数成为内联函数,仅仅将inline放在函数声明前面不起任何作用。inline是一种“用于实现”的关键字,而不是一种“用于声明”的关键字。

(1)内联函数的作用

●对于内联函数,C++有可能直接用函数体代码来替代对函数的调用,这一过程称为函数体的内联展开。

●对于只有几条语句的小函数来说,与函数的调用、返回有关的准备和收尾工作的代码往往比函数体本身的代码要大得多。因此,对于这类简单的、使用频繁的小函数,将之说明为内联函数可提高运行效率。

(2)慎用内联函数

内联是以代码膨胀复制为代价,仅仅省去了函数调用的开销,从而提高函数的执行效率。如果执行函数体内代码的时间,相比于函数调用的开销较大,那么效率的收获会很少。另一方面,每一处内联函数的调用都要复制代码, 将使程序的总代码量增大,消耗更多的内存空间。以下情况不宜使用内联:

1)如果函数体内的代码比较长,使用内联将导致内存消耗代价较高。

2)如果函数体内出现循环,那么执行函数体内代码的时间要比函数调用的开销大。

关键词new

“new”是C++的一个关键字,它通常用来在堆上创建数组或对象,但它与一般的创建数组或对象的方法不同,它在创建数组或对象时,会返回这个对象的指针。

pow,powf,powl

头文件:

#include <cmath>

命名空间:

std

参数:

x:底,y:指数,定义域范围为 x ∈ [-Infinity, +Infinity],y ∈ [-Infinity, +Infinity],当 x < 0 时 y 必须是整数

返回值:

x 的 y 次幂,值域范围为 [-Infinity, +Infinity]
NAN:定义域错误,例如 x < 0 并且 y 不是整数,此时全局变量 errno 的值为 EDOM
计算可能会溢出,此时全局变量 errno 的值为 ERANGE

构造函数

构造函数 ,是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载

1.构造函数的命名必须和类名完全相同。

2.构造函数的功能主要用于在类的对象创建时定义初始化的状态。它没有返回值,也不能用void来修饰。这就保证了它不仅什么也不用自动返回,而且根本不能有任何选择。而其他方法都有返回值,即使是void返回值。尽管方法体本身不会自动返回什么,但仍然可以让它返回一些东西,而这些东西可能是不安全的;

3.构造函数不能被直接调用,必须通过new运算符在创建对象时才会自动调用;而一般的方法是在程序执行到它的时候被调用的;

4.当定义一个类的时候,通常情况下都会显示该类的构造函数,并在函数中指定初始化的工作也可省略。

5.构造函数有回滚的效果,构造函数抛出异常时,构造的是一个不完整对象,会回滚,将此不完整对象的成员释放(c++)

6.当一个类只定义了私有的构造函数,将无法通过new关键字来创建其对象,当一个类没有定义任何构造函数,C#编译器会为其自动生成一个默认的无参的构造函数。

7.在Python中构造函数必须通过重写__init__方法实现

C++构造函数

C++语言为类提供的构造函数可自动完成对象的初始化任务,全局对象和静态对象的构造函数在main()函数执行之前就被调用,局部静态对象的构造函数是当程序第一次执行到相应语句时才被调用。然而给出一个外部对象的引用性声明时,并不调用相应的构造函数,因为这个外部对象只是引用在其他地方声明的对象,并没有真正地创建一个对象。

C++的构造函数定义格式为:

class <类名>

{

public:

<类名>(参数表);

//...(还可以声明其它成员函数)

};

<类名>::<函数名>(参数表)

{

//函数体

}

如以下定义是合法的:

class T

{

public:

T(int a=0){ i=a; }//构造函数允许直接写在类定义内,也允许有参数表。

private:

int i;

};

如果一个类中没有定义任何的构造函数,那么编译器只有在以下三种情况,才会提供默认的构造函数:

1、如果类有虚拟成员函数或者虚拟继承父类(即有虚拟基类)时;

2、如果类的基类有构造函数(可以是用户定义的构造函数,或编译器提供的默认构造函数);

3、在类中的所有非静态的对象数据成员,它们对应的类中有构造函数(可以是用户定义的构造函数,或编译器提供的默认构造函数)。

<类名>::<类名>(){},即不执行任何操作。

#include <iostream>
using namespace std;
class time
{
public:
    time()//constructor.构造函数
    {
        hour=0;
        minute=0;
        sec=0;
    }
    void set_time();
    void show_time();
private:
    int hour, minute, sec;
};
int main()
{
    class time t1;
    t1.show_time();
    t1.set_time();
    t1.show_time();
    return 0;
}
void time::set_time()
{
    cin>>hour>>minute>>sec;
}
void time::show_time()
{
    cout<<hour<<":"<<minute<<":"<<sec<<endl;
}

任何时候,只要创建类或结构,就会调用它的构造函数。类或结构可能有多个接受不同参数的构造函数。构造函数使得程序员可设置默认值、限制实例化以及编写灵活且便于阅读的代码。

C++ 的构造函数以该类的类名为标识,且不写返回值类型也无法返回值

1

class C{public:  C(void){    ...  }};

构造函数的函数体执行是在各个成员构造完之后才开始,因此要想更改成员的构造方式需要使用成员初始化列表:

1

class D: public B{public:  D(void): B("Hello, world!"){    ...  }};

复制构造函数接受同类对象的左值引用(一般为 const T &)、移动构造函数接受右值引用(一般为 T&&):

1

class E{public:  E(const E &e){...}//Copy constructor  E(E &&e){...}//Move constructor};

C++ 中,程序员若未对某类定义构造函数(以及赋值函数、析构函数),编译器在满足条件时会定义相应的函数。

C++ goto 语句

goto 语句允许把控制无条件转移到同一函数内的被标记的语句。

注意:在任何编程语言中,都不建议使用 goto 语句。因为它使得程序的控制流难以跟踪,使程序难以理解和难以修改。任何使用 goto 语句的程序可以改写成不需要使用 goto 语句的写法。

min_element

min_元素是在指定的范围内找到最小元素的第一次出现,其中排序标准可以由二元谓词指定。

auto

自动指定变量类型

4.1代替冗长复杂的变量声明

我们在使用迭代器时常常会这样操作:

list<int> l1;
l1.push_back(1);
l1.push_back(2);
l1.push_back(3);

for (list<int>::iterator i = l1.begin(); i!= l1.end(); i++){
	cout << i.operator->() << endl;
	cout << *i << endl;
}

这样list<int>::iterator i = l1.begin()的声明迭代器i看起来繁琐冗长,我们实际可以用auto代替:auto i = l1.begin();
4.2定义模板参数时,用于声明依赖模板参数的变量

template <typename _Tx,typename _Ty>
void Multiply(_Tx x, _Ty y)
{
    auto v = x+y;
    std::cout << v;
}

如上所示:我们获取x+y的值,但是x、y都是模板类型,我们无法知道其类型,这时就可以使用auto。
4.3模板函数依赖于模板参数的返回值

template <typename _Tx, typename _Ty>
auto multiply(_Tx x, _Ty y)->decltype(x*y)
{
    return x*y;
}

上面的例子中,返回值依赖于xy的类型,这里我们需要提前查询xy的数据类型,需要用到decltype操作符,它是C++11标准引入的新的运算符,其目的也是解决泛型编程中有些类型由模板参数决定,而难以表示它的问题。
注意:auto在这里的作用也称为返回值占位,它只是为函数返回值占了一个位置
rand函数

在c++中没有random函数,rand()x表示的是给出(0,x)的随机数。

要取得[a,b)的随机整数,使用(rand() % (b-a))+ a (结果值 [a,b) )。
要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a (结果值 [a,b] )。
要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1 (结果值(a,b] )。

(总的来说,通用公式:a + rand() % n ;其中的a是起始值,n是整数的范围)
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值