c++注意点

const常量

  • 使用该修饰符定义常量,必须初始化
  • 一旦定义任何地方没法改
  • 如果定义的是一个整型常量,关键字 int 可以省略

const常量可以与指针一起使用,有 3 组合情况:

  1. 指向常量的指针:是指一个指向常量的指针变量
    const char*p =“abcd”;,所以不能改变指针指向的字符,比如 p【3】=‘h’ 是错误的,因为它指向的事一个字符串常量,所以不能更改内容,但可以改变该指针的所指方向:如 p=“kkvkvk”;那就是对的;

  2. 常指针:是一个指向固定的一个指针;
    char const *p=“45678”; 若这样子操作则是错的:p=“kkvkvk”;若是 p[3]='k’则对的,因为指向的地址没变;

  3. 指向常量的常指针:const char const*p=“46df”;这个就怎么不能改了;

int const* a 相当于 const int *a 这是指向常量的指针
(可改变指针指向地址,不能改变指针指向的变量的内容)
不是 int *const a; 这是常指针;(不可以改变指针指向的变量,但可以改变该变量的内容)

#include<iostream>
using namespace std;
int main()
{ 
	const int a1=7;
	int const a2=8;
	int c1=9;
	int c2=10;
	const int *d1=&a1;
	const int *d2=&c1;
	int const *e1=&a1;
	int const *e2=&c1;
	e2=e1;
  //*e2=33;
	int *const f1=&c1;
	int *const f2=&c2;
//	int *const f3=&a1;
//  f2=f1;
    *f2=33;
	const int *const g1=&a2;
	const int *const g2=&c2;
	//g2=g1;
	cout<<"a1="<<a1<<"a2="<<a2<<endl;
	cout<<"d1="<<d1<<"d2="<<d2<<endl;
	cout<<"e1="<<e1<<"e2="<<e2<<endl;
cout<<"f1="<<f1<<"f2="<<f2<<endl;
cout<<"g1="<<g1<<"g2="<<g2<<endl;
return 0;

const常量初始化

如 const int a;a的值不能修改,不能给它赋值,如何才能让它一开始就拥有一个值?

1、在声明的时候对他进行初始化

const int a=1;

2、在函数中声明的形参,在函数被调用时会得到实参的值。
3、在类中只能通过初始化列表初始化
详细看这里

静态变量

  1. 跨文件,隐藏
    当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。
  2. static的第二个作用是保持变量内容的持久
    存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。虽然这种用法不常见,但我还是举一个例子
  3. static的第三个作用是默认初始化为0.其实全局变量也具备这一属性
  4. 静态成员可以直接用类名调用

内联函数在编译的时候是将该函数的目标代码插入到每个调用该函数的地方

  1. 不能有递归
  2. 不能有静态数据成员
  3. 不能有循环
  4. 不能有switch和goto语句;
  5. 不能包含数组
    若内联函数没有满足上述要求将会被作为普通函数处理
#include<iostream>
using namespace std;
inline int locate();/先声明了一个内敛函数
int main()
{ 
locate();
}
inline int locate()
{
cout<<"hh"<<endl;
}

多态性

面向对象有两种编译方式:静态联编和动态联编;
1.静态联编是指系统在编译时就决定如何实现某一动作,速度快;
2.动态联编是系统在运行的时候动态决定某一动作,灵活度高;
编译时多态性是通过使用重载来获得,运行时多态性通过视同继承和虚函数获得的;
实现多态性的机制叫做动态绑定

友元类与继承

  • 友元关系不能继承。基类的友元对派生类的成员没有特殊访问 权限。如果基类被授予友元关系,则只有基类具有特殊访问权限,该基类的派生类不能访问授予友元关系的类

例:

#include <iostream> 
using namespace   std; 
class B; 
class A 
{ 
	int a; 
public: 
	A(int x=0) { a=x; } 
	friend class B; 
}; 
class B 
{ 
	int b; 
public: 
	void fun(A& ob){ cout << ob.a << endl;} 
}; 
 
class C:public B
{ 
public: 
	//void fun2(A& ob){ cout <<ob.a <<endl;}   //派生类新加的函数却不能访问A,此句会报错
}; 
 
void   main() 
{ 
	A a(55); 
	C c; 
	c.fun(a); //C是B的派生类   通过基类B的函数fun仍然可以访问 
} 

另一个友元类与继承类,容易与上面混淆的知识点

多重继承中的命名冲突

当两个或多个基类中有同名的成员时,如果直接访问该成员,就会产生命名冲突,编译器不知道使用哪个基类的成员。这个时候需要在成员名字前面加上类名和域解析符::,以显式地指明到底使用哪个类的成员,消除二义性。

#include<iostream>
using namespace std;

class base {  public: int x;   };
class One:public base{};
class Two:public base{};
class OT:public One,public Two{
public:  int func();
};
void main() {    OT p;     p.One::x = 0; }//或p.Two::x = 0;   而 p.base::x = 0;  是错误的

派生类只能访问基类的成员,不可以放访问基类的基类成员

注意点:静态的运用

#include<iostream>
using namespace std;
class Obj{
static int i;
public:
Obj(){i++;}
~Obj(){i--;}
static int getVal(){return i;}
};
int Obj::i=0;
void f (){Obj ob2;cout<<ob2.getVal();}
int main(){
Obj obl;
f();
Obj*ob3=new Obj;//这一步很特殊
cout<<ob3->getVal();
delete ob3;
cout<<Obj::getVal();
return 0;//结果为221
}

话说指针ob3他确确实实有调用构造函数,所以count是有加到3的,关键是为什么输出的是 2呢
因为 f()函数里面的生成对象ob2 是个局部变量,函数执行完毕,自动释放空间,自然就要析构掉这个对象

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 概述.............................................................................................................................................1 1.1. 自然语言&计算机语言................................................................................................1 1.2. 计算机语言 & C/C++语言..........................................................................................2 1.3. 简单的C/C++程序及其运行方法(环境的使用)................................................2 1.3.1. C/C++程序开发运行环境....................................................................................2 1.3.2. 格式输出函数printf()和格式输入函数scanf()....................................................3 1.4. 习题..............................................................................................................................5 2. 基本的C语言................................................................................................................................6 2.1. C语言中的名词——类型、量值(常量和变量)....................................................6 2.1.1. 整型和整型量值...................................................................................................6 2.1.2. 浮点型和浮点量(常量和变量).......................................................................8 2.1.3. 字符型和字符量(常量和变量).......................................................................9 2.1.4. 字符串常量.........................................................................................................10 2.2. C语言中的动词—运算符,短语-表达式 和和特殊动词性关键字....................11 2.2.1. 赋值运算符和赋值表达式.................................................................................11 2.2.2. 算术运算符和算术表达式.................................................................................12 2.2.3. 逻辑运算符和逻辑表达式.................................................................................13 2.2.4. 关系运算符和关系表达式.................................................................................14 2.2.5. 其它运算符和表达式.........................................................................................15 2.2.6. 不同类型量值的不同运算的混合.....................................................................17 2.3. C语言中的连词及句子——分支、循环和顺序语句..............................................19 2.3.1. if-else:如果-那么...........................................................................................19 2.3.2. switch-case语句..................................................................................................21 2.3.3. ?-:语句................................................................................................................23 2.3.4. for........................................................................................................................23 2.3.5. while....................................................................................................................24 2.3.6. do-while..............................................................................................................25 2.3.7. goto-label-if.........................................................................................................26 2.3.8. break....................................................................................................................27 2.3.9. continue...............................................................................................................28 2.4. C语言中的句子小结..................................................................................................28 2.5. 用C语言写一段话——程序段..................................................................................29 2.6. 用C语言写复杂段落——语句嵌套..........................................................................29 2.6.1. 复杂段落——语句嵌套的含义.........................................................................29 2.6.2. 嵌套语句的示例.................................................................................................30 2.6.3. 复杂段落——语句嵌套的小结.........................................................................33 2.7. 总结............................................................................................................................33 习题...........................................................................................................................................34 3. C语言的横向名词性扩充..........................................................................................................34 3.1. C语言的横向名词性扩充(1):同类变量的集合——数组..................................34

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值