1.C++特性,基本语法,标识符,static关键字

C++

之前学c++不是很重视,现在打算重新学一遍,以此记录。

学习 C++,关键是要理解概念,而不应过于深究语言的技术细节。
学习程序设计语言的目的是为了成为一个更好的程序员,也就是说,是为了能更有效率地设计和实现新系统,以及维护旧系统。

- 1.1 C++简介

C++ 是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言,支持过程化编程、面向对象编程和泛型编程。

tips:
1.使用静态类型的编程语言是在编译时执行类型检查而不是在运行时执行类型检查。
2.C++ 是 C 的一个超集,事实上,任何合法的 C 程序都是合法的 C++ 程序

面向对象的程序设计:
完全支持面向对象的程序涉及,包括面向对象开发的四大特性:

  • 封装
  • 抽象
  • 继承
  • 多态

标准库:

  • 核心语言:all构件块,包含变量、常量、数据类型等。
  • 标准库:函数库,用于操作文件、字符串等。
  • 标准模板库(STL):提供方法操作数据结构等。

C++和C的区别:

设计思想上:
C++是面向对象的语言,而C是面向过程的结构化编程语言

语法上:
C++面向对象的特性使其具有封装、抽象、继承、多态等特性
C++相比C,增加多许多类型安全的功能,比如强制类型转换
C++支持范式编程,比如模板类、函数模板等

- 1.2基本语法

#include <iostream>
using namespace std;
int main()
{
	cout << "Hello Wrold";
	return 0;
}
  1. 第一行,include 为预处理指令,iostream为输入输出流
  2. using namespace std;告诉编译器使用std命名空间。您可能会写一个名为 xyz() 的函数,在另一个可用的库中也存在一个相同的函数 xyz()。这样,编译器就无法判断您所使用的是哪一个 xyz() 函数。因此,引入了命名空间这个概念,专门用于解决上面的问题,它可作为附加信息来区分不同库中相同名称的函数、类、变量等。使用了命名空间即定义了上下文。本质上,命名空间就是定义了一个范围。
  3. main()函数为主函数,即程序开始执行的地方
  4. cout输出流对象,为C++系统预定义的对象,
  5. return 0;终止main()函数,并向调用进程返回值0;
  6. 单行注释用双斜杠//,多行注释用/* 开始 */结束

标识符

C++ 标识符是用来标识变量、函数、类、模块,或任何其他用户自定义项目的名称。
要求:
大小写字母下划线_开始
标识符内
不得出现标点
字符。(如@ & %)

关键字
即C++预先声明好的单词,有特定功能。
下表为关键字:
在这里插入图片描述

static关键字:

1.全局静态变量:
定义:在全局变量前加上关键字static,全局变量就定义成一个全局静态变量.
内存位置:静态存储区
初始化:未经初始化的全局静态变量会被自动初始化为0(而自动对象的值是任意的)
作用域:从定义开始到文件结尾,别的文件不可见。

2.局部静态变量
定义:在局部变量之前加上关键字static,局部变量就成为一个局部静态变量。
内存位置:静态存储区
初始化:未经初始化的局部静态变量会被自动初始化为0(自动对象的值是任意的,除非他被显式初始化);
作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域结束。但是当局部静态变量离开作用域后,并没有销毁,而是仍然驻留在内存当中,只不过我们不能再对它进行访问直到该函数再次被调用,并且值不变;(static定义的静态局部变量分配在数据段上,普通的局部变量分配在上,会因为函数栈帧的释放而被释放掉)

C++ 不支持在函数外返回局部变量的地址,除非定义局部变量为 static 变量。所以如果你想函数返回一个数组指针,这个数组必须被设置为static变量(见文档8.数组)添加链接描述

3.静态函数
在函数返回类型前加static,函数就定义为静态函数。函数的定义和声明在默认情况下都是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用
warning:不要再头文件中声明static的全局函数,不要在cpp内声明非static的全局函数,如果你要在多个cpp中复用该函数,就把它的声明提到头文件里去,否则cpp内部声明需加上static修饰

4.类的静态成员
在类中,静态成员可以实现多个对象之间的数据共享,并且使用静态数据成员还不会破坏隐藏的原则,即保证了安全性。因此,静态成员是类的所有对象中共享的成员,而不是某个对象的成员。对多个对象来说,静态数据成员只存储一处,供所有对象共用

5.类的静态函数
静态成员函数和静态数据成员一样,它们都属于类的静态成员,它们都不是对象成员。因此,对静态成员的引用不需要用对象名。

在静态成员函数的实现中不能直接引用类中说明的非静态成员,可以引用类中说明的静态成员(这点非常重要)。如果静态成员函数中要引用非静态成员时,可通过对象来引用。从中可看出,调用静态成员函数使用如下格式:<类名>::<静态成员函数名>(<参数表>);

总结:
1.对于函数定义和代码块之外的变量声明,static修改标识符的链接属性由默认的external变为internal,作用域和存储类型不改变,这些符号只能在声明它们的源文件中访问
2.对于代码块内部的变量声明,static修改标识符的存储类型,由自动变量改为静态变量,作用域和链接属性不变。这种变量在程序执行之前就创建,在程序执行的整个周期都存在。(static定义的静态局部变量分配在数据段上,普通的局部变量分配在上,会因为函数栈帧的释放而被释放掉)C++ 不支持在函数外返回局部变量的地址,除非定义局部变量为 static 变量。所以如果你想函数返回一个数组指针,这个数组必须被设置为static变量(见文档8.数组)添加链接描述
3.对于被static修饰的类成员变量和成员函数,它们是属于类的,而不是某个对象所有对象共享一个静态成员。静态成员通过<类名>::<静态成员>来使用。加了static关键字,则此变量/函数就没有了this指针了,必须通过类名才能访问。

static初始化

C++中由于引入了对象,导致原本在C语言中static是在编译期初始化的,现在需要分不同的static变量在不同时间初始化

1)编译时初始化:
如果静态变量本身时基本数据类型,且初始化为一个常量,那么在编译期完成,发生在mian函数之前。

2)运行时初始化

2.1)加载时初始化
程序被加载时立刻初始化,发生在main函数之前,被称为 饿汉式初始化;
这种情况有两种:
1.静态变量是基本数据类型,但是其初始值不是常量,比如是个指针数组。
2.静态变量是类对象

2.2)在第一次被引用的时候,哪个线程最先访问到这个变量,谁就初始化这个变量。即只有第一次初始化了,后面再次初始化就无效。存在线程安全问题 称之为懒汉式初始化。包括静态变量所在的局部函数/全局函数/类的静态成员函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值