C++ 语法

const 变量只能在定义的时候赋值(const l2 = 10; 或者l1 = 10; l2 =l1)
const变量可以为非const变量赋值.

在使用重载运算符时,包括其运算对象的类型和返回值的类型,都是由该运算符定义的,但是运算对象的个数,运算符的优先级和结合律都是无法改变的.

int i = 0; cout << i << ” ” << ++i << endl; –>1 1
int j = 0; cout << j << ” ” << j++ << endl; –> 1 0
“<<”运算符没有规定何时以及如何对运算对象求值,因此上述输出表达式是未定义的.(书上是这么描述的,但事实上上述表达式输出的值是固定的).

f() + g() * h() + l() 函数的调用顺序是不确定的.(书上面是这么描述的,但测试是按照f,g,h,l的顺序执行的)

m%(-n) 等于 m%n (-m) % n 等于 -(m % n)

将变量定义为引用,可以避免对元素的拷贝.

递增运算符的优先级高于解引用运算符 p++等价于(p++)

类对象可以调用类中定义的常量成员函数,但是在常量函数内不能改变类数据成员的值.也可以调用类中定义的非常量成员函数.
常量类对象只能调用类中定义的常量成员函数,不能调用类中定义的非常量成员函数.
这是因为默认情况下this的类型是指向类类型非常量版本的常量指针,由于const的初始化规则,我们不能将一个常量对象绑定到一个非常量的常量指针,所以我们不能在一个常量对象上调用类中普通成员函数.

构造函数不能声明为const,在我们创建一个const对象时,直至构造函数完成初始化过程,对象才能真正取得其”常量”属性,因此,构造函数在const对象构造过程中可以向其写值.

只有当类没有声明任何构造函数时,编译器才能自动生成默认构造函数.

用class和struct定义类的唯一区别就是默认权限.使用class定义的类所有的成员默认是private,使用struct定义的类所有的成员默认是public.

友元的声明只能出现在类的内部,但是在类内出现的具体位置不限.友元不是类的成员也不受它的区域访问控制级别的约束.
友元的声明仅仅指定了访问权限,而非一个通常意义上的函数声明.如果我们希望类的用户能够调用某个友元函数,那么我们就必须在友元声明之外再专门对函数进行一次声明.(许多编译器并未强制限定友元函数必须在使用之前在类的外部声明).

封装的两个优点:
确保用户代码不会无意间破坏封装对象的状态.
被封装的类的具体实现细节可以随时更改,而无需调整用户级别的代码.

类中用来定义类型的成员,必须先定义后使用.

可变数据成员,在变量的声明中加入mutable关键字.
一个可变数据成员永远不会是const,即使它是在const对象的成员,而且,const成员函数也可以改变一个可变数据成员的值

string return(const string &str){return str;}该函数返回的是str的一个副本或者一个未命名的临时string对象.
string &return(const string &str){return str;}该函数的返回类型是一个引用.不管函数调用还是返回结果都不会真正拷贝string对象.

一个类的成员类型不能是该类自己,但类允许包含指向它自身类型的引用或指针.

定义在类内部的函数,都是隐式内联的.

友元函数或友元类中的所有成员函数都可以访问该类中的私有成员.

如果类成员使用了外部作用域中的某个名字,而该名字代表一种类型,则类不能在之后重新定义该名字.

如果类成员是const,引用,或者属于某种未提供默认构造函数的类类型,我们必须通过构造函数初始值列表为这些成员提供初始值.

explicit能够抑制构造函数定义的隐式转换,它只对一个实参的构造函数有效,需要多个实参的构造函数不能用于执行隐式转换.
explicit构造函数只能用于直接初始化,不能执行拷贝形式的初始化.
只能在类内声明构造函数时使用explicit关键字,在类外部定义时不应重复.

类中的静态成员函数不与任何对象绑定在一起,它们不包含this指针.作为结果,静态成员函数不能声明成const的,而且我们也不能在static函数体内使用this指针,这一限制既适用于this的显式使用,也对调用非静态成员的隐式使用有效.
在类的外部定义静态成员时,不能重复static关键字,该关键字只出现在类内部的声明语句.

静态成员变量和普通成员变量的区别:
静态数据成员的类型可以是它所属的类类型,而非静态数据成员则受到限制,只能声明成它所属类的指针或引用.
静态成员变量可以作为默认实参,非静态成员变量不能作为默认实参,因为它的值本身属于对象的一部分,这么做的结果是无法真正提供一个对象以便从中获取成员的值,最终引发错误.

因为静态数据成员不属于类的任何一个对象,所以它们并不是在创建类的对象时被定义的,这意味着它们不是由类的构造函数初始化的,而且以便来说,我们不能在类的内部初始化静态成员.相反的,必须的类的外部定义和初始化每个静态成员.和其他对象一样,一个静态数据成员只能定义一次.

通常情况下,类的静态成员不应该在类的内部初始化.然而我们可以位静态成员提供constexpr整数类型的类内初始值,不国要求静态成员必须是字面值常量类型的constexpr.
即使一个常量静态数据成员爱类内部被初始化了通常情况下也应该在类的外部定义一下该成员.
class Example
{
public:
static constexpr double rate = 6.5;
static constexpr int vecSize = 20;
static vector vec[vecSize];
};
constexpr double Example::rate;
vector Example::vec[vecSize];

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值