2019年12月

  • explicit关键字只能修饰只有一个参数的类构造函数。
  • explicit表明该函数时显式的,不能进行自动地隐式类型转换。

    class Demo{
    public:
    Demo();  //没有参数,无法进行类型转换
    Demo(double a);  //有一个参数,可以进行类型转换
    Demo(int a, double b);  //有两个参数,无法进行类型转换
    Demo(int a, int b = 10, double c = 1.6);  //有三个参数,其中两个参数有默认值,故可以进行隐式转换
    ~Demo();
    ...
    };
  • implicit 隐式的,类构造函数默认情况下声明为隐式的

    class Demo{
    public:
    Demo();                    
    explicit Demo(double a);  // 无法进行隐式转换   
    Demo(int a,double b);           
    ~Demo();
    };
    Demo test;
    test = 12.2  ×
    
    test = (Demo)12.2 √

void memset(void str,int c, size_t n)

str —— 指向要填充的代码块
c —— 要填充的值,但是函数在填充内存块时是使用该值的无符号字符形式。
n —— 要被设置为该值的字节数。

#include <stdio.h>
#include <string.h>

int main ()
{
   char str[50];

   strcpy(str,"This is string.h library function");
   puts(str);

   memset(str,'$',7);
   puts(str);
   
   return(0);
}
This is string.h library function
$$$$$$$ string.h library function

参考链接

static_cast是一个c++运算符,功能是把一个表达式转换为某种类型,但没有运行时类型检查来保证转换的安全性。

  • 用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换。
    进行上行转换(把派生类的指针或引用转换成基类表示)是安全的。进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的。
  • 用于基本数据类型之间的转换。
#include <iostream>

using namespace std;

int main() {
    double a = 3.236;
    int b = static_cast<int>(a);
    cout << b <<endl;
    cout << sizeof(b) << endl;
    return 0;
}
3
4
  • 把空指针转换成目标类型的空指针。
  • 把任何类型的表达式转换成void类型。

参考百度

  • volatile只能保证被其修饰变量的内存可见性(线程B 总能得到线程
    A 中最新的共享变量),但如果对该变量执行的是非原子操作线程依旧是不安全的
没有 volatile 时,线程A 会将操作结果写到 CPU 缓存中,而不是内存中,有机会的时候(比如,CPU 缓存不够用的时候),才会将 CPU 缓存中的内容存到内存,存到内存以后,其他线程就可以看到了。
而 volatile 将结果写入 CPU 缓存的同时,就会将结果写入到内存中。
static 修饰的变量在程序中只会初始化一次,在线程间共享,理论上,在某一个线程中修改了变量,其他的线程会马上发现。但是,为了提高优化速度和运行速度,一个线程修改这个变量是不一定立即写回内存让其它线程看到的,这时候就需要用volatile强制要求每次改变都写回内存了。
  • synchronized既可以保证其修饰范围内存可见性和操作的原子性,所以synchronized是线程安全的

参考链接:https://www.cnblogs.com/howo/p/8525665.html

1.c++11新标准规定,允许将变量声明为constexpr类型以便由编译器来验证变量的值是否是一个常量表达式。
2.一般来说,如果你认为变量是一个常量表达式,那就把它声明为constexpr类型。

int sth(){
return 4;
}
const int n=sth();

不能通过编译

constexpr int sth(){
return 4;
}
const int n=sth();

可以通过编译