最高准则:无二义性
二义性是任何逻辑体系的最高准则,在C++中,如果出现定义、语句、逻辑自相矛盾时,程序便无法运行,数学界的三次数学危机,本质上就是为了消除“二义性”的争端。
准则的具体体现:
(1) 运算符的优先级与结合性。
优先级是为了消除诸如3+4×5 的表达式,是应该被当作 (3+4)×5 还是3+(4×5)的二义性而设定的规则。
结合性是为了区别诸如a/b/c的表达式,与a/(b/c)的不同
示例代码:
int x = 3+4*5;
(2)标识符不能以数字开头
如果标识符以数字开头,那么会和常量的定义产生冲突,例如无法判断123是一个变量还是常量。
(3)贪心规则
程序在读取了一个字符之后,会继续读取下一个字符,直到不能产生意义之后再停止,当出现a+++b这样的表达式时,程序会自动读取为(a++)+b,因此这个表达式是有意义且可以正确运行的,贪心规则的使用使得该表达式并不会出现a+(++b)的情况出现。
示例代码:
string Stu_name_1;
(4)命名空间
C++中使用不同的命名空间可以对不同的变量进行区分,可以防止相同的变量名有不同的含义产生矛盾与冲突,也是为了消除变量的二义性。
(5)虚继承
在多继承的场景里,当父类中存在同名变量时,子类访问父类的同名变量,将出现二义性,因此在子类的变量前加virtual便可以实现虚继承,便可以访问父类中的同名变量。
示例代码:
class A {
public:int a;
}
class B:virtual class A{
};
class C:public B{
};
int main()
{
C c;
c.a=1; //可以成功运行读取父类中的同名变量不会出现二义性
return 0;
}
第二准则:高效性
如果有两个行为A与B,均满足无二义的规则,且A比B高效,则C++语言会选择A行为作为标准语法。需要说明,并非所有语言,都有对高效性的绝对准求。高效性准则只对基础的C++语法规则有效,在STL库与模板中,已经不再是次高准则了。
(1)数组下标0索引。
对于数组中第i个元素的地址计算,当数组下标从0开始时,a[i]的地址= 首地址 + i*数据长度;当数组下标从1开始时,,a[i]的地址= 首地址 + (i-1)*每个数据所占的长度,从0开始比从1开始少了一个减法运算,提高了计算机的运算效率。
(2) 逻辑短路
逻辑短路规则为对于表达式a&&b 当a为假时,b不会计算 ,表达式的值为0。
(3) 头文件””和<>的使用
使用<>这种方式,编译器查找的时候,会在编译器的安装目录的标准库中开始查找,如果找不到则在当前的工程所在文件夹中寻找,""这种方式,会在当前的工程所在的文件夹开始寻找,当头文件为当前工程所实现时,使用””会增加效率。
(3)内联函数
C++ 内联函数是通常与类一起使用。如果一个函数是内联的,那么在编译时,编译器会把该函数的代码副本放置在每个调用该函数的地方。程序在编译器编译的时候,编译器将程序中出现的内联函数的调用表达式用内联函数的函数体进行替换,而对于其他的函数,都是在运行时候才被替代。因此内联函数可以提高程序运行的效率,在类定义中的定义的函数都是内联函数,即使没有使用 inline 说明符。
第三准则:合乎日常习惯
第三准则的出现是为了给程序员的使用带来便利,笔者的理解认为第三准则也有第二准则的原因所在,合乎日常习惯的代码使用能够从程序员自身实现高效性并将该编程语言继续使用且发扬光大。
(1)赋值
整数可以给实数赋值,整型变量可以定义整型指针,字符型变量,可以定义字符型指针。这是合乎日常习惯的。
(2)数组的定义
数组的长度定义不能是变量,是因为在分配内存的过程中,如果数组的长度定义是变量,则无法准确分配内存。如果要实现动态分配内存,可以使用new语句进行动态数组的定义,也可以使用vector实现动态数组,是采用了栈的方式。
(3)函数重载
函数重载中比较重要的是运算符重载,运算符重载是为了满足日常生活中各个运算符号对于不同类型的数据都可以进行运算,例如可以实现虚数的加减乘除自增自减等,示例代码如下:
class Com
{
friend ostream& operator<<(ostream& os, Com& com);
friend istream& operator>>(istream& is, Com& com);
private:
double a;
double b;
public:
Com();
Com(double i, double j) { a = i; b = j; };
~Com() =default;
Com operator + (const Com& com);
Com operator - (const Com& com);
Com operator * (const Com& com);
Com operator / (const Com& com);
Com operator ++ ();
Com operator -- ();
};
补充准则:相似相同规则
C++中,如果有两个不同的对象A与B,A有行为a,B有行为b,如果a与b两种行为在逻辑上具有相似性,则C++会为对象A额外增加一个行为b,也会将对象B额外增加一个行为a。
(1)变量初始化
C++中变量的初始化方式有三种,分别是等号初始化(a=1;a=b)、括号初始化(a(1);a(b);a=(1);a=(b))、列表初始化(a{1};a{b};a={1};a={b}),其中,括号初始化是变量和对象之间的“相似相同规则”,列表初始化是变量和数组之间的“相似相同规则”。
(2)引用初始化
C++中引用的初始化是引用和变量之间的“相似相同规则”,有以下几种初始化方法:
示例代码:
string &i=j;
stirng &i(j);
(2)数组访问形式
当指针指向数组时,可以发现,通过指针来访问,写法是*(p+5)=1;通过数组来访问,写法是a[5] = 1,根据相似相同原则,数组可以使用*的写法,而指针可以使用[]的写法,一共有4种访问形式。
结语
因学习C++的程序尚不够深入,在之后的学习当中会对本文进行进一步的补充说明,将C++的语法规则理解归纳为四类基本准则,如有错误,欢迎指正。