知识屋:更实用的电脑技术知识网站
所在位置:首页 > 科技

C/C++零碎语法总结

发表时间:2022-03-25来源:网络

主要总结平时可能遇到,但是不常用的语法现象。 主要分析C/C++标准语法,做到平台无关。

基本语法类

 explicit 关键字:

  如果c++类的构造函数有一个参数,那么在编译的时候就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象,这叫隐式转换。

  explicit关键字用来修饰类构造函数,使其失去隐式转换功能。使用方法见代码如下:

 

代码 class MyClass
{
public:
MyClass(
int num );
}

MyClass obj

= 10; //ok,convert int to MyClass

class MyClass
{
public:
explicit MyClass( int num );
}

MyClass obj

= 10; //err,can't non-explict convert

 

  2.  const 关键字:

       对于const在C中的用法,这里部分转载了这篇文章。

  在C中,const关键字的用途就是使函数操作时不改变其修饰的变量的值。平常我们见得多的const用法有如下几种,似乎可以总结为“就近原则”:即const最靠近其右边哪个变量,就说明那个变量为常量。”

 

代码 const int *p1; /* p1所指向的int变量值不可改变,为常量,但可以改变p1指针的值 */
int * const p2; /* p2指针为常量,即p2的值不可改变,但可以改变p2指向对象的值 */
const int * const p3; /* p3指针是常量,同时p3所指向int对象的值也是常量 */

const char **s; /* s 和 (*s)都是可变的,但(**s)是不可变的 */

const 在 c++中的使用,主要涉及到类对象,及类成员函数,需要注意以下几点:

声明为const的对象只能访问类中声明为const的成员函数,不能调用其它成员函数. const 成员函数的声明格式为: 类型说明符   函数名(参数表)const,例: void print(int i) const;

 

const是函数类型的一个组成部分,因此在实现部分也要带const关键字. const成员函数不能更新对象的数据成员,也不能调用该类中没有用const修饰的成员函数,另外C中也有const函数,该函数不能改变在该函数外面声明的变量。 

       3.   inline 关键字

       inline的作用相当于宏,编译器执行替换工作(宏是用预处理器)。inline使用要注意几点

  在类声明中定义函数,会隐式的成为inline函数。   在头文件中定义函数,需要将其声明为inline,否则会出现链接时多重定义的错误。   inline是向编译器发出的请求,而不是命令,编译器有权不对复杂的函数执行inline化。   对类的私有成员的读取函数inline化是不错的选择。  

  4.     # 和 ##

  #的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号。

 

#define Str(x) #x

char *a = Str(abc);
char *b = "abc"
//a b 所指字符串同为“abc”

 

       ##作用为将括号内的字符串和括号外的字符串联结起来

#define Z(nVar) master_##nVar


Z(a);

// master_a
Z(b); // master_b

   5. 左值与右值

左值就是一个可被存储的单元,右值就是一个可被读取的数据。C++标准中,对于int   a,   b;来说,a和b都是左值。
但由于“a   =   b”这种赋值表达式中,赋值号右边需要的是个右值,所以当你把一个左值放上去的时候,编译器会把它隐式转换成一个右值,即取用那个变量所对应的存储单元中的数值。
而相反,假如你放上去的本来就是个右值,比如:
a   =   5;
a   =   sizeof(a);
a   =   strlen( "abcde ");
等等,那就没有任何隐式转换发生。

在C++中

(x++)不是左值,&(x++)会报错,(++x)是左值。而在C中,二者皆不能通过,因为表达式完全求值,二者都是右值。

模板语法类

      模板语法可能是最恐怖的部分。

    模板的特化

模板的特化是当模板的范型功能成为设计的障碍时采取的一种策略。它可以看成对一般模板的重载,以满足特定需求(例如对某种特殊类型要求进行不一般化的处理)。其基本用法举例如下:

 

代码 template
int compare(const char* const &v1,
const char* const &v2)
{
return strcmp(v1,v2);
}
const char *cp1 = "world", *cp2 = "hi";
int i1, i2;
compare(cp1,cp2);
//calls the specialization
compare(i1,i2); //calls the generic version instantiated with int

 

其中template是不能省略的,它指明了一下的内容仍然是模板的定义,而不是普通函数。

收藏
  • 人气文章
  • 最新文章
  • 下载排行榜
  • 热门排行榜