c++中string a;和string b();的区别

c++中string a;和string b();的区别

#include <iostream>
#include <string>
using namespace std;

int now(){
   return 1;
}

int main(){
   string a;
   string b();   
   string c("abc");
   string c1("a");
   string d(10,'c');
   cout<<"a的值是: "<<a<<endl;
   cout<<"b的值是: "<<b<<endl;
   cout<<"c的值是: "<<c<<endl;
   cout<<"c1的值是: "<<c1<<endl;
   cout<<"d的值是: "<<d<<endl;
   return 0;
}

image-20220220193120221

默认初始化

string a;

这是默认初始化,string是一个类类型,每个类各自决定其初始化对象的方式,而且,是否允许不经初始化就定义对象也由类自己决定,如果类允许这种行为,它将决定对象的初始值到底是什么,绝大多数类都支持无需显式初始化而定义对象,这样的类提供了一个合适的默认值,string类就规定如果没有指定初值,就生成一个空串,所以打印a的值的时候没有内容。

声明函数

string b();

乍一看是直接初始化+没有参数,其实不是,根据VSCode的代码提示,编译器把b看作一个函数

image-20220220191227783

因为所有的函数名都是蓝颜色的:

image-20220220191313973

直接初始化

   string c("abc");
   string c1("a");
   string d(10,'c');

上述代码是直接初始化,由此得出一个准则:对string进行直接初始化的时候,括号中一定要有值

这个准则背后也蕴含了一个道理:

  • 如果我们想赋予string变量一个初始值,那么我们肯定知道这个值是多少,所以我们要把这个值告诉编译器。
  • 如果我们不想赋予string变量一个初始值,那么默认初始化就好了。

例外情况

如果一个类M重载了调用运算符,那么可以使用M()的形式,这里和初始化没有任何关系,这里是调用了调用运算符

参考资料:《c++ primer中文版》

posted on 2022-02-21 11:34  coderabcd  阅读(798)  评论(0)    收藏  举报

导航