static浅谈

 Example

#include <iostream.h>
//无论采用什么样的操作,程序代码都是在内存中运行的,只有在内存中占有一席之地,
//我们才能访问它,如果一个成员函数或成员变量还未在内存中产生,结果是无法访问的

class point
{
public:
 
 void output()
 {
  cout << x <<endl;
  cout << y <<endl;

 }
 static void OutPut1()
 {
  cout<< ++x <<endl;
  cout << ++y <<endl;
    // cout << z <<endl;
 }
 //在静态成员函数中是不能调用非静态成员成员的,
private:
 static int x;

 static int y;

 int z;
};
//对于静态成员变量,必须对其进行初始化,并且应在类的定义之外进行初始化。
int point::x = 0;

int point::y = 0;
//静态成员函数和静态成员变量属于类本身,在类加载的时候,即为它们分配了空间
//所以可以通过类名::变量名,来访问,而非静态成员函数和非静态成员变量成员属于
//对象的方法和数据,也就是应该首先产生类对象,然后通过类的对象来引用。

void main()
{
 point pt;
 pt.output();

 point::OutPut1();

}

详细解析

静态类成员包括静态数据成员和静态函数成员两部分。

一 静态数据成员:

类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成员。和其他数据成员一样,静态数据成员也遵守public/protected/private访问规则。同时,静态数据成员还具有以下特点:

1.静态数据成员的定义。
静态数据成员实际上是类域中的全局变量。所以,静态数据成员的定义(初始化)不应该被放在头文件中。
其定义方式与全局变量相同。举例如下:

xxx.h文件
class base{
private:
static const int _i;//声明,标准c++支持有序类型在类体中初始化,但vc6不支持。
};

xxx.cpp文件
const int base::_i=10;//定义(初始化)时不受private和protected访问限制.

注:不要试图在头文件中定义(初始化)静态数据成员。在大多数的情况下,这样做会引起重复定义这样的错误。即使加上#ifndef #define #endif或者#pragma once也不行。

2.静态数据成员被 类 的所有对象所共享,包括该类派生类的对象。即派生类对象与基类对象共享基类的静态数据成员。举例如下:
class base{
public :
static int _num;//声明
};
int base::_num=0;//静态数据成员的真正定义

class derived:public base{
};

main()
{
base a;
derived b;
a._num++;
cout<<"base class static data number _num is"<<a._num<<endl;
b._num++;
cout<<"derived class static data number _num is"<<b._num<<endl;
}
// 结果为1,2;可见派生类与基类共用一个静态数据成员。

3.静态数据成员可以成为成员函数的可选参数,而普通数据成员则不可以。举例如下:
class base{
public :
static int _staticVar;
int _var;
void foo1(int i=_staticVar);//正确,_staticVar为静态数据成员
void foo2(int i=_var);//错误,_var为普通数据成员
};

4.★静态数据成员的类型可以是所属类的类型,而普通数据成员则不可以。普通数据成员的只能声明为 所属类类型的 指针或引用。举例如下:

class base{
public :
static base _object1;//正确,静态数据成员
base _object2;//错误
base *pObject;//正确,指针
base &mObject;//正确,引用
};

5.★这个特性,我不知道是属于标准c++中的特性,还是vc6自己的特性。
静态数据成员的值在const成员函数中可以被合法的改变。举例如下:

class base{
public:
base(){_i=0;_val=0;}

mutable int _i;
static int _staticVal;
int _val;
void test() const{//const 成员函数

_i++;//正确,mutable数据成员
_staticVal++;//正确,static数据成员
_val++;//错误

}
};
int base::_staticVal=0;

二,静态成员函数
静态成员函数没有什么太多好讲的。

1.静态成员函数的地址可用普通函数指针储存,而普通成员函数地址需要用 类成员函数指针来储存。举例如下:
class base{
static int func1();
int func2();
};

int (*pf1)()=&base::func1;//普通的函数指针
int (base::*pf2)()=&base::func2;//成员函数指针


2.静态成员函数不可以调用类的非静态成员。因为静态成员函数不含this指针。

3.静态成员函数不可以同时声明为 virtual、const、volatile函数。举例如下:
class base{
virtual static void func1();//错误
static void func2() const;//错误
static void func3() volatile;//错误
};


最后要说的一点是,静态成员是可以独立访问的,也就是说,无须创建任何对象实例就可以访问。

### Spring Boot框架简介与使用方法 Spring Boot 是由 Pivotal 团队提供的一个开源框架,旨在简化基于 Spring 框架的项目开发过程。它遵循“约定大于配置”的设计原则,减少了开发者在配置上的工作量[^2]。通过内置的默认配置和自动化配置机制,Spring Boot 提供了快速构建独立、生产级别的 Spring 应用程序的能力。 #### 1. Spring Boot 的核心概念 Spring Boot 的核心理念是减少开发者的负担,提供开箱即用的功能。以下是 Spring Boot 的几个关键特性: - **自动化配置**:Spring Boot 根据类路径中的依赖项自动配置 Spring 应用程序。例如,当引入数据库驱动依赖时,Spring Boot 会自动配置数据源和相关的 Bean 对象[^2]。 - **嵌入式服务器**:Spring Boot 内置了 Tomcat、Jetty 或 Undertow 等 Web 容器,使得应用程序可以独立运行而无需外部部署环境。 - **起步依赖(Starters)**:Spring Boot 提供了一系列的 Starter 模块,这些模块封装了常用的依赖和配置,方便开发者快速集成各种功能。例如,`spring-boot-starter-web` 提供了构建 Web 应用所需的所有依赖[^2]。 - **监控支持**:通过引入 `spring-boot-starter-actuator` 依赖,开发者可以获得丰富的监控指标,包括应用健康状态、线程池信息、内存使用情况等[^1]。 #### 2. Spring Boot 的执行流程 Spring Boot 的主要执行流程可以分为以下几个阶段: - **加载配置**:Spring Boot 从多个来源(如 `application.properties` 或 `application.yml` 文件)加载配置属性,并将其注入到应用程序中。 - **自动化配置**:根据类路径中的依赖项和配置属性,Spring Boot 自动配置 Spring 上下文。 - **启动嵌入式容器**:如果应用程序是一个 Web 应用,Spring Boot 将启动嵌入式 Web 容器。 - **运行应用程序**:完成上述步骤后,Spring Boot 启动应用程序并开始处理请求[^1]。 #### 3. 创建一个简单的 Spring Boot 项目 以下是创建和运行一个简单 Spring Boot 项目的步骤: 1. **添加依赖** 在 `pom.xml` 文件中添加 Spring Boot 的依赖项: ```xml <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.0.0</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> ``` 2. **编写主类** 创建一个包含 `@SpringBootApplication` 注解的 Java 类: ```java import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } } ``` 3. **创建控制器** 添加一个 REST 控制器来处理 HTTP 请求: ```java import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { @GetMapping("/hello") public String sayHello() { return "Hello, Spring Boot!"; } } ``` 4. **运行项目** 使用以下命令运行项目: ```bash mvn spring-boot:run ``` 访问 `http://localhost:8080/hello` 即可看到输出结果。 #### 4. Spring Boot 的优势 Spring Boot 提供了诸多优点,使其成为现代 Java 开发的首选框架之一: - **快速集成**:通过 Starter 模块,开发者可以秒级集成各种框架[^2]。 - **减少配置**:完全抛弃繁琐的 XML 配置,采用注解和配置文件的方式进行开发[^2]。 - **内置监控**:通过 Actuator 模块,开发者可以获取丰富的监控指标[^1]。 - **易于扩展**:虽然 Spring Boot 本身是一个微框架,但它可以通过 Spring Cloud 等工具扩展以支持服务发现、注册、负载均衡等功能[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值